01 棧與佇列

2022-07-05 23:03:13 字數 3114 閱讀 4090

目錄補充題目:

參考資料

第一章 棧與佇列

1-1 設計getmin功能的棧

思路:儲存每次棧更新時的最小值,可以通過定義另外乙個棧實現。

1-2 由兩個棧組成的佇列

思路: 佇列是先進先出,棧是先進後出。入佇列的時候將元素放入棧1,出佇列時,如果棧2為空,將棧1的元素全部彈出壓入棧2,這樣棧2的彈出的元素就符合先進先出的原則了。這裡要注意將棧1的元素壓入棧2的時機

1-3 設計遞迴函式逆序乙個棧

思路:

設計遞迴函式reverse實現棧的逆序,引數是乙個棧s:

1.如果s為空,則直接返回

2.如果s非空:

上面的整個邏輯是完整,唯一問題就是(1)得到並刪除s的棧底元素v該怎麼實現?

同樣設計乙個遞迴函式:getandremovelastelement實現返回並刪除棧底元素,引數是棧s:

1.出棧乙個元素v

2.檢查棧是否為空:

1-5 用乙個棧實現另外棧的元素排序

思路:

假設排序棧為orderstack,另外乙個棧為helpstack,實現orderstack從頂到底按從大到小的順序排序,這裡可以轉換一下思路,等同於實現helpstack從頂到底按從小到大的順序排序。

注意點:

1-7生成視窗最大值陣列

思路:

​ 需要借助雙端佇列。佇列用於儲存當前滑動視窗下的最大值的下標

需要注意:

每個下標的都至多進出佇列一次,所以時間複雜度時o(n)。

個人注意點:

1-9 求最大子矩陣(牛客鏈結)

力扣鏈結

第一種思路個人理解(多個橫著的柱狀圖矩形面積求最大):

1.首先將原問題問題進行分解。

2.求解每個子問題

時間複雜度=子問題的個數*子問題的求解時間 = o(nmn)

另外一種的理解(多個豎著的柱狀圖的矩形面積求最大)

1.首先對問題進行分解,轉化成求以當前行為底的直方圖的最大矩形面積,有n行則操作n次。

2.求直方圖的的最大矩形面積時,對每個小矩形向左和右擴充套件。實際計算需要採用棧,棧從棧頂到棧底存有每個小矩形的位置下標。要求從頂到底高度遞減。有m列,即m個位置,要求o(m)操作完成。

總結:1-10 最大值減去最小值小於等於n的子陣列數量

基本思路:

首先暴力解法時找出所有的子陣列然後判斷是否滿足條件,時間複雜度時o(n^3)。

基本步驟

​ 按照陣列的開頭的位置不同,分別計算從位置0開始的陣列,從位置1開始的陣列...的滿足條件的子陣列個數,然後相加即可。

注意:章節知識點總結:

1.滑動視窗的思想_csdn

2 棧的使用

補充題目:

可見山峰對問題(**未通過)

乙個環形山脈,哪兩座山的烽火可以相互看見,條件如下:

思路:

簡化問題:n座山的高度都是不同的情況:

如果只有1座山,那麼有0對

如果有兩座山,那麼有1對。

如果有n座山,那麼有2*n-3對。

假設a(1),b(2),c(3),d(4)三座山,a最多找到2座山配對,b最多也能2座山配對。我們要確保,a的2個配對與b的2個配對不能重複的情況。例如(a,b)可能會重複計數2次。因此我們需要在配對的時候,進行約定,避免這種重複情況出現。

限制:對於每座山,只配對比它高的山峰(小找大)。

上面的限制只是為了方便思考,不會對最終的結果產生思想,但是解題的時候有了上述的限制,對解題思路的產生有著重大的作用。對這個解題空間進行了明確的劃分。

在這樣的限制下,考慮n座不同高度山的情況,我們需要考慮三種情況:

n座山中的高度可以重複:

在這種情況下,我們需要借助棧去解決問題,借助棧的原因在於小找大的限制。

基本思路如下:

1)先挑選乙個高度最高的山入棧。

2)然後從高度最高的山下一座山開始遍歷,完成這個遍歷。

3)遍歷完成後,堆疊中還會剩餘。對於剩餘的也要分為2種情況考慮:

情況2:棧的大小為1

#include#include#include#includeusing namespace std;

typedef struct moun mu,*pmu;

int combination_sum(int n)

vectorm(1000005);

stackmystack;

int main()

}int result = 0;

int index = 0;

pmu p_top;

mystack.push(m[max_index]);

for(int j = 1;j < num;++j)else if(p_top->h == m[index].h)else

}if(!mystack.empty())

if(mystack.size() == 2)else

}else if(mystack.size() == 1)

}cout << result << endl;

return 0;

}

參考資料

01 京東2017校招程式設計題 - 保衛方案(山峰對數量)

02 程式設計師**面試指南

棧與佇列 建立棧 佇列

陣列棧 完成stack createstack int maxelements 函式,該函式建立乙個棧,maxelements為與分配的棧空間大小 棧可用空間為array 0,maxelements 1 typedef int elemtype struct stackrecord typedef ...

棧 佇列與優先佇列

123 45 include stack int s 入棧 push 出棧 pop 取棧頂top 123 45 include queue int s 入隊 push 出隊 pop 取隊首元素 front 不刪除 123 4priority queue int pq 入隊 push 出隊 pop 取...

棧 佇列與優先佇列

123 45 include stack int s 入棧 push 出棧 pop 取棧頂top 123 45 include queue int s 入隊 push 出隊 pop 取隊首元素 front 不刪除 123 4priority queue int pq 入隊 push 出隊 pop 取...