挡板问题lc11&lc42

这类题好像用单调栈比较好解,但是我单调栈不熟悉。这里是双指针。

11.盛最多水的容器

1.遍历肯定可以。

2.使用双指针

盛最多水的容器

思路:

双指针开始放在首尾,然后向中间缩进。左右两边每次移动小的那一个指针(移动小的可能会让结果更大)

就算再低,之前外围已经有高的了,所以无影响,但是更高可能可以增加蓄水量。

class Solution {
public:
    int maxArea(vector& height) {
        //有点类似最长非递增(非递减)子序列
        
            int maxnum=0;
        
        int a=0;
        int b=height.size()-1;
        if(height.size()<=1){
            return 0;
        }else if(height.size()==2){
            return min(height[a],height[b]);
        }
        while(a!=b){
            maxnum=max(maxnum,min(height[a],height[b])*(b-a));
            if(height[a]>height[b]){
                b-=1;
            }else{
                a+=1;
            }
        }
            return maxnum;
    }
};

类似

Description:
不同高度的挡板,每个挡板之间的间隔为1个单位,现在在挡板之间加沙子。挡板之间最多能容纳多少沙子?
 Example: 
4个挡板及其高度: 3,3,42,5 
最多能加沙子数: 3+3+5 = 13 

5个挡板及其高度:2,3,3,4,1 
最多能加沙子数: 2+3+3+1 = 9 

4个挡板及其高度: 5,2,1,8 
最多能加的沙子数:5+5+5 = 15 

Question: 最多能加多少沙子?

面试题,没有找到原题,但是和接雨水题比较相似,写一个demo。

需要维持leftmax,rightmax。即当前位置左右最高挡板高度。

如何维持leftmax,rightmax呢?需要借鉴LeetCode11,双指针,然后向中间移动较小的那一个,每次增加的沙子量是左右max最小的那部分,直到左右相遇。

class Solution {
public:
    int trap(vector& height) {
        int leftmax=height[0];
        int rightmax=height[height.size()-1];
        int lindex=0;
        int rindex=height.size()-1;
        int ans=0;
        while(lindex!=rinidex){
        rightmax=max(height[rindex],rightmax);
        leftmax=max(height[lindex],leftmax);
            if(height[lindex]>height[rindex]){
            
                ans+=rightmax;
                rindex-=1;
            }else{
                ans+=leftmax;
                lindex+=1;
            }
        }
    }
};

lc42 接雨水

这个有个最重要的公式

ans += min(lMax[i], rMax[i]) - h[i];

即每个位置的蓄水量是左右挡板的最低值减去此刻挡板高度。

如何维持leftmax,rightmax呢?需要借鉴LeetCode11,双指针,然后向中间移动。每次移动较低的那一个。每个位置的蓄水量是左右挡板的最低值减去此刻挡板高度。

class Solution {
public:
    int trap(vector& height) {
        if(height.size()<=2){
            return 0;
        }
        int leftmax=height[0];
        int rightmax=height[height.size()-1];
        int lindex=0;
        int rindex=height.size()-1;
        int ans=0;
        while(lindex!=rindex){
            rightmax=max(height[rindex],rightmax);
            leftmax=max(height[lindex],leftmax);
            if(height[lindex]>height[rindex]){
            
                ans+=rightmax-height[rindex];
                rindex-=1;
            }else{
                ans+=leftmax-height[lindex];
                lindex+=1;
            }
        }
        return ans;
    }
};

你可能感兴趣的:(挡板问题lc11&lc42)