目錄補充題目:
參考資料
第一章 棧與佇列
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 取...