力扣刷题记录(27)LeetCode:503、42、84

503. 下一个更大元素 II

力扣刷题记录(27)LeetCode:503、42、84_第1张图片

因为数组是个循环数组,相较于普通数组要多考虑一种情况。就是当前元素的下一个更大的数可能会出现在当前元素的前面。为了解决这个问题我们需要对数组进行两次遍历。

class Solution {
public:
    vector nextGreaterElements(vector& nums) {
        stack sk;
        vector ans(nums.size(),-1);
        sk.push(0);
        for(int i=1;i<2*nums.size();i++)
        {
            while(!sk.empty())
            {
                if(nums[i%nums.size()]>nums[sk.top()])
                {
                    ans[sk.top()]=nums[i%nums.size()];
                    sk.pop();
                }
                else break;
            }
            sk.push(i%nums.size());
        }
        return ans;
    }
};

42. 接雨水

力扣刷题记录(27)LeetCode:503、42、84_第2张图片

这是一道比较经典的用单调栈来解决的题目。用一个栈来单调递增地存储已经遍历过的元素,如果遇到当前元素大于栈顶元素,而栈顶元素的下一个元素肯定是不小于栈顶元素的,那么当前元素、栈顶元素及栈顶元素的下一个元素这三个元素就可以存储到水。唯一注意的细节是栈顶元素可能没有下一个元素,这种情况就不能存储到水了。

class Solution {
public:
    int trap(vector& height) {
        int ans=0;
        stack sk;
        sk.push(0);
        for(int i=1;iheight[sk.top()])
                {
                    int mid=sk.top();
                    sk.pop();
                    //这里要考虑mid的左边是否还有元素
                    //也就是sk是否为空
                    //没有元素是无法接到雨水的
                    if(sk.empty())  break;
                    int h=min(height[i],height[sk.top()])-height[mid];
                    ans+=h*(i-sk.top()-1);
                }
                else    break;
            }
            sk.push(i);
        }
        return ans;
    }
};


84. 柱状图中最大的矩形

力扣刷题记录(27)LeetCode:503、42、84_第3张图片

解题思路:矩形的面积是由最短的柱子所决定的。如果我们可以找到当前柱子左边第一个比它低的i和右边第一个比它低的j,那么i、j中间柱子的高度一定大于等于当前柱子。我们就可以求得以当前柱子的高为高,以i、j间的距离为宽的矩形的面积。如果我们对每个柱子都进行这种操作,那么就可以找出最大的矩形。

需要注意的是对于最后一个元素我们不肯找出右边比它还小的元素了,因为右边已经没有元素了。同时对于最小的那个元素,我们也无法找到左边或者右边比它还小的元素了,因为它已经是最小的那个元素了。综上,我们需要在原数组的左右两端各补一个0.

class Solution {
public:
    int largestRectangleArea(vector& heights) {
        heights.insert(heights.begin(),0);
        heights.push_back(0);
        stack sk;
        int ans=0;
        sk.push(0);
        for(int i=1;i

 

你可能感兴趣的:(leetcode,算法,数据结构,c++)