11.盛最多水的容器

65 阅读1分钟

11. 盛最多水的容器 - 力扣(LeetCode)

双指针, 选l,r中高度最小的移动 。然后找第一个高于当前最小高度的下标,然后计算取max更新答案

class Solution {
    public int maxArea(int[] height) {
        int l = 0, r = height.length-1;
        int mm = (r-l)*Math.min(height[l],height[r]);
        while(l < r) {
            if(height[l] < height[r]) { //选l,r中高度最小的移动
                int idx = l;
                //找第一个高于当前值的下标,然后计算取max更新答案
                while(idx < r&&height[idx] <= height[l]) { //注意这里要idx < r 不然 最外层的循环永远不会停止,因为一直不会 l = r
                    idx++;
                }
                l = idx;
                mm = Math.max(mm,(r-l)*Math.min(height[l],height[r]));
            }
            else {
                int idx = r;
                while(idx > l&&height[idx] <= height[r]) {  // idx > l 
                    idx--;
                }
                r = idx;
                mm = Math.max(mm,(r-l)*Math.min(height[l],height[r]));                
            }
        }
        return mm;
    }
}