LeetCode腾讯精选50题--盛最多水的容器

题目:

 分析:

  第一眼看这个题目的时候,我们首先想到的两个for循环,Math.max,Math.min判断大小,最后返回最大容量

  想法很好,分析下时间复杂度  O(n^2)  n为数组长度   题目给的范围为n<=10^5 超时了

 

想其他方法   双指针行不行

双指针指向数组的左右边界    l = 0,r = n;   

假设数据 [1,8,6,2,5,4,8,3,7]    第一次能盛水  1 * 8 = 8;

接着指针移动 

(1)假设l向右移动    则此时盛水 7 * 7 = 49

(2)假设r向左移动   则此时盛水 1 * 7 = 7   

以此类推    l和r数据判断,谁小谁移动   

PS:

误区:数组内存在多个数据的时候,我们盛水量只跟左边界和右边界有关,不用判断边界内数据的大小

代码:

class Solution {
    public int maxArea(int[] height) {
       int l = 0,r = height.length - 1;
       int max = 0;
       while(l < r){
           int len = r - l;
           max = Math.max(max,Math.min(height[l],height[r]) * len);
           if(height[l] < height[r]) l ++ ;
           else r --;
       }

       return max;
    }

}

复杂度分析 :时间复杂度  O(n)     空间复杂度O(1)

 

posted @ 2022-09-22 11:15  [吃瓜][吃瓜]  阅读(22)  评论(0)    收藏  举报