[刷题班] LeetCode11. 盛最多水的容器

题目描述

思路:左右指针

方法一:暴力,超出时间限制

模拟所有情况,记录最大的体积值。
体积 = Math.min(height[i], height[j]) * (j - i)

class Solution {
    public int maxArea(int[] height) {
        int res = Integer.MIN_VALUE;

        for (int i = 0; i < height.length; i ++) {
            for (int j = i + 1; j < height.length; j ++) {
                int edge = Math.min(height[i], height[j]);
                res = Math.max(res, (j - i) * edge);
            }
        }
        return res;
    }
}

时间复杂度O(n2)

方法二:双指针

思路

  • 初始化:双指针left和right分别位于水槽左右两端;
  • 循环收窄: 直至双指针相遇时跳出;
    • 更新面积最大值:res;
    • 选定两板高度中的短板,向中间收窄一格;
  • 返回值:返回面积最大值res即可;

木桶容量由短板决定, 移动长板的话, 水面高度不可能再上升, 而宽度变小了, 所以只有通过移动短板, 才有可能使水位上升.

class Solution {
    public int maxArea(int[] height) {
        int left = 0, right = height.length - 1;
        int res = 0;
        while (left < right) {
            int w = right - left;
            int h = Math.min(height[left], height[right]);
            res = Math.max(res, w * h);
            if (height[left] < height[right]) {
                left ++;
            } else {
                right --;
            }
        }
        return res;
    }
}
posted @ 2024-01-14 16:16  Ac_c0mpany丶  阅读(3)  评论(0编辑  收藏  举报