盛水最多的容器[中等][双指针][贪心]

113 阅读1分钟

题目

image.png

思路

基本的思路是使用双指针

  • left是从最左边开始,right是从最右边开始,计算由left和right围成的区域的容器的容积为tmp,将tmp和max比较,max取当前可以取到的最大值。
  • 然后对于left和right位置的height进行比较,哪侧的height比较小,就移动哪侧向中心移动。
  • 重复上述的过程,直到left和right相遇。

我认为这道题的代码不难实现,但是如何解释用这个思路来写代码比较重要。

为什么哪侧height小,就移动哪侧?

因为在当前的状态下,不论哪一边发生移动,都必定会导致容器的宽度-1。同时如果移动了height较大的那一侧的指针,那么后序的容积不可能会比当前的max再大了(因为会受制于小的那一侧的高度),所以需要移动height较小的那一侧的指针。

代码

var maxArea = function(height) {
    let max = 0, left = 0, right = height.length - 1;
    while(left < right){
        let tmp = Math.min(height[left], height[right]) * (right - left);
        max = max > tmp? max: tmp;
        if(height[left] < height[right]){
            left++;
        }else{
            right--;
        }
    }
    return max;
};