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)