算法日志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号
浙公网安备 33010602011771号