相關leetcode題目:
496. 下乙個更大元素 i
503. 下乙個更大元素 ii
556. 下乙個更大元素 iii
31. 下乙個排列
739. 每日溫度
這類題最終要求的結果都是比當前元素更大的下乙個元素的位置
求解思路:
就比如上學做操時的排隊,如果你向後望去一馬平川,說明後面沒有比你更高的人,如果後面有高個擋住了你的視線,那他就是你後面第乙個比你高的人。將排隊的人還原成乙個陣列,同時維持乙個遞增棧,從後向前遍歷陣列,當棧頂元素小於當前元素,則棧頂彈出,始終保證棧內元素遞增。
**模板:核心**為while迴圈(將棧內所有小於當前元素的值都pop()出去)
vector<
int> nums;
vector<
int>
ans(nums.
size()
,0);
stack<
int> skt;
for(
int i = nums.
size()
-1; i >=0;
--i)
ans[i]
= skt.
empty()
?-1: nums[skt.
top()]
; skt.
push
(i);
}
下乙個更大元素 i
vector<
int>
nextgreaterelement
(vector<
int>
& nums1, vector<
int>
& nums2)
mp[nums2[i]
]= skt.
empty()
?-1: skt.
top();
skt.
push
(nums2[i]);
} vector<
int> ans;
for(
auto i : nums1)
return ans;
}
下乙個更大元素 ii
這題需要解決的問題是迴圈搜尋陣列,可行的方法是將陣列擴大兩倍,變相的實現迴圈遍歷,然後將下標與陣列大小取模,得到的下標就是有效下標
vector<
int>
nextgreaterelements
(vector<
int>
& nums)
doublevec[i]
= skt.
empty()
?-1: skt.
top();
skt.
push
(nums[i%sz]);
} vector<
int> ans;
for(
int i =
0; i < sz;
++i)
return ans;
}
下乙個更大元素 iii
int
nextgreaterelement
(int n)
if(end !=0)
skt.
push
(i);}if
(end ==0)
else
long
long ans =
stoll
(str);if
(ans > int_max)
return ans;
}
每日溫度
vector<
int>
dailytemperatures
(vector<
int>
& t)
stack<
int> skt;
vector<
int>
ans(t.
size()
,0);
for(
int i = t.
size()
-1; i >=0;
--i)
ans[i]
= skt.
empty()
?0: skt.
top(
)- i;
skt.
push
(i);
}return ans;
}
下乙個排列
void
nextpermutation
(vector<
int>
& nums)
stack<
int> skt;
int begin =0;
int end =0;
for(
int i = nums.
size()
-1; i >=0;
--i)
if(end !=0)
skt.
push
(i);}if
(begin ==0)
else
}
單調棧總結
單調棧一般可以對於給定的數列,求每個值v在他左右的區間 l,r 是最小值 最大值 通過單調遞增 遞減 棧來實現。1.用處 求每個值v是哪個區間 l,r 的最小 大 值,一般還會和區間 l,r 有關係 poj2796 feel good 給定數列 要求一 個區間內最小值乘區間和,的最大值。poj255...
單調佇列與單調棧總結
ref 單調棧解決的是以某個值為最小 最大 值的最大區間,實現方法是 求最小值 最大值 的最大區間,維護乙個遞增 遞減 的棧,當遇到乙個比棧頂小的值的時候開始彈棧,彈棧停止的位置到這個值的區間即為此值左邊的最大區間 同時,當乙個值被彈掉的時候也就意味著比它更小 更大 的值來了,也可以計算被彈掉的值得...
單調棧 佇列總結
51nod 1102 面積最大的矩形 有乙個正整數的陣列,化為直方圖,求此直方圖包含的最大矩形面積。法一 以每個柱子為高,預處理出每個點能夠向兩邊延伸的距離,左找到第乙個比當前點高度小的下標記為i,向右找到第乙個比當前點高度小的下標記為j,那麼此時以這點高度的最大值是f i j i 1 然後用for...