算法日志10:单调栈
前言
本文为代码随想录 单调栈刷题
每日温度
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
st.push(0);
vector<int> res(temperatures.size());
for(int i = 1; i<temperatures.size();i++){
//先检查栈是否为空,再检查top(),否则可能访问到未知内存
while( !st.empty()&& temperatures[st.top()] < temperatures[i] ){
res[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return res;
}
};
下一个更大元素
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
unordered_map<int, int> map;
for(int i =0 ;i<nums1.size();i++){
map[nums1[i]] = i;
}
stack<int> st;
vector<int> res(nums1.size(),-1);
for(int i = 0; i < nums2.size();i++){
while(!st.empty() && nums2[st.top()] < nums2[i]){
if(map.count(nums2[st.top()]) > 0) res[map[nums2[st.top()]]] = nums2[i];
st.pop();
}
st.push(i);
}
return res;
}
};
下一个更大元素
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
stack<int> st;
vector<int> res(nums.size(),-1);
for(int i = 0; i<nums.size()*2;i++){
int cur = i%nums.size();
while(!st.empty() && nums[st.top()] < nums[cur]){
res[st.top()] = nums[cur];
st.pop();
}
st.push(cur);
}
return res;
}
};
接雨水
class Solution {
public:
int trap(vector<int>& height) {
int res =0;
stack<int> st;
st.push(0);
for(int i = 1; i<height.size();i++){
while(!st.empty() && height[st.top()]<height[i]){
int mid = st.top();
st.pop();
if(!st.empty()) {
int h = min(height[st.top()], height[i]) - height[mid];
int w = i - st.top() - 1;
res+=h*w;
}
}
st.push(i);
}
return res;
}
};

浙公网安备 33010602011771号