739.每日溫度
題目連結 文章講解 影片講解
單調棧適合的場景:求當前元素左面或右面第一個比它大或小的元素
- 單調棧裡存什麼元素
只要存下標就可以了,比較元素時可以透過下標取元素 - 單調棧是單調增還是單調減(從棧頂到棧底)
使用單調增的單調棧
解題步驟:
- 遍歷陣列,當棧空時直接入棧
- 如果棧不空比較當前元素與棧頂元素,如果當前元素大於棧頂元素,則記錄距離,並彈出棧頂元素
- 迴圈第二步直到棧空或者棧頂元素不小於當前元素,將當前元素入棧
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
vector<int> result(temperatures.size(), 0);
for(int i = 0; i < temperatures.size(); ++i) {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
result[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return result;
}
};
496.下一個更大元素I
題目連結 文章講解 影片講解
思路:建立一個map對映,將nums1中的元素和下標做對映,使得根據元素可以獲得下標
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> st;
vector<int> result(nums1.size(), -1);
unordered_map<int, int> umap;
for(int i = 0; i < nums1.size(); ++i) umap[nums1[i]] = i;
for(int i = 0; i < nums2.size(); ++i) {
while(!st.empty() && nums2[i] > st.top()) {
if(umap.find(st.top()) != umap.end())
result[umap[st.top()]] = nums2[i];
st.pop();
}
st.push(nums2[i]);
}
return result;
}
};
503.下一個更大的元素II
題目連結 文章講解 影片講解
只需將陣列遍歷兩遍,計算下標時使用i % nums.size()
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
stack<int> st;
vector<int> result(nums.size(), -1);
for(int i = 0; i < 2 * nums.size(); ++i) {
while(!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
result[st.top()] = nums[i % nums.size()];
st.pop();
}
st.push(i % nums.size());
}
return result;
}
};