首页 > 编程语言 >【算法训练营day59】LeetCode503. 下一个更大元素II LeetCode42. 接雨水

【算法训练营day59】LeetCode503. 下一个更大元素II LeetCode42. 接雨水

时间:2023-02-22 22:26:12浏览次数:62  
标签:nums int top height II day59 LeetCode503 st size

LeetCode503. 下一个更大元素II

题目链接:503. 下一个更大元素II

独上高楼,望尽天涯路

和昨天的那道题大部分是一个思路,对于循环数组,只需要遍历nums两遍即可。

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() - 1; i++) {
            while (!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
                result[st.top()] = nums[i % nums.size()];
                st.pop();
            }
            if (result[i % nums.size()] == -1) {
                st.push(i % nums.size());
            }
        }
        return result;
    }
};

慕然回首,灯火阑珊处

思路一样。


LeetCode42. 接雨水

题目链接:42. 接雨水

独上高楼,望尽天涯路

经典题目,挖个坑,二刷的时候把所有方法都练会。

慕然回首,灯火阑珊处

一刷仅考虑单调栈解法,按照行方向计算雨水,下面这段话很形象的阐述了单调栈解法的思路。

因为一旦发现添加的柱子高度大于栈头元素了,此时就出现凹槽了,栈头元素就是凹槽底部的柱子,栈头第二个元素就是凹槽左边的柱子,而添加的元素就是凹槽右边的柱子。

class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> st;
        int sum = 0;
        for (int i = 0; i < height.size(); i++) {
            while (!st.empty() && height[i] > height[st.top()]) { // 不需要考虑等于,因为是按照行方向计算
                int mid = st.top();
                st.pop();
                if (!st.empty()) {
                    int h = min(height[i], height[st.top()]) - height[mid];
                    int w = i - st.top() - 1;
                    sum += h * w;
                }
            }
            st.push(i);
        }
        return sum;
    }
};

标签:nums,int,top,height,II,day59,LeetCode503,st,size
From: https://www.cnblogs.com/BarcelonaTong/p/17146204.html

相关文章