LeetCode || 双指针 / 单调栈

11. Container With Most Water

题意:取两根求最大体积

思路:使用两个指针分别指向头和尾,然后考虑左右两根:

对于小的那根,如果选择了它,那么能够产生的最大体积一定是当前的情况:因为当前情况体积=这根长度 * 当前距离,以后的话长度一定是左右边界的min,即<=这根长度,距离一定越来越小

因此小的那根以后就不会被选了,因此把小的那根的指针挪动一下

直到指针相遇

class Solution {
public:
    int maxArea(vector<int>& height) {
        int ans = 0;
        int l = 0, r = height.size() - 1;
        while (l < r) {
            ans = max(ans, (r - l) * min(height[l], height[r]));
            if (height[l] <= height[r]) l++;
            else r--;
        }
        return ans;
    }
};
View Code

42. Trapping Rain Water

题意:给一些柱形块,求下雨时可积水的体积,如图

思路:用一个单调递减栈,只有当遇到更高的柱形的时候才会产生积水,此时的栈顶是积水的底,次栈顶是左边界,当前是右边界。

每次先栈中把比当前柱小的都计算好面积出栈,然后将当前柱入栈

class Solution {
public:
    int trap(vector<int>& height) {
        stack<int> s;
        int n = height.size();
        int ans = 0;
        for (int i = 0; i < n; i++) {
            if (s.empty() || height[i] < height[s.top()]) {
                s.push(i);
            }
            else {
                while (!s.empty() && height[s.top()] < height[i]) {
                    int t = s.top();
                    s.pop();
                    if (!s.empty()) {
                        ans += (i - s.top() - 1) * (min(height[s.top()], height[i]) - height[t]);
                    }
                }
                s.push(i);
            }
        }
        return ans;
    }
};
View Code

猜你喜欢

转载自www.cnblogs.com/pinkglightning/p/10317384.html
今日推荐