11. 盛最多水的容器

题目链接:https://leetcode.cn/problems/container-with-most-water/

11. 盛最多水的容器_第1张图片

解题思路:贪心

容器的存水量为:底*高,更具体地来说,假设容器由i和j两条线段和坐标抽围成(假设i

对于一个矩形来说,如果想要面积最大,则底和高都尽可能地大,因此不妨先设底最大,即开始时选择最右边和最左边的线段围成容器,此时容器的底是最大的。接下只需要找到使容器的高尽可能大的两条线段,设两个指针i=0和j=height.length-1分别指向容器的左边界和有边界,接下来求解容器的最大值时,只需要移动i和j两个指针即可,如何移动?

  1. 有三种选择,移动线段较短的指针和移动线段较长的指针,无论移动哪一个指针,都会使容器的底-1

  1. 移动线段较长的指针:假设height[i]>height[j],则j--,则移动后容器的存水量为,因为j是较长的指针,那么min(height[i],height[j])>=min(height[i],height[j-1])一定成立。因为:

  1. min(height[i],height[j])=height[i]

  1. min(height[i],height[j-1])要么等于height[i],要么小于height[i],这种移动方法只会使得容器的大小不会超过移动前容器的大小(其中容器的底小1,高要么不变,要么更小,不可能比移动前容器的容量大)

  1. 移动线段较短的指针:假设height[i],因为i是较短的指针,所以height[i++]可能大于height[i],这种情况下min(height[i],height[j])移动后容器的容量可能会变大)

  1. 当i和j指向的线段长度相等时,随便移动一个即可

  1. 因此,移动较短线段的指针,在移动过程中记录最大的容器容量即可

  1. AC代码

class Solution {
    public static int maxArea(int[] height) {
        int left = 0;
        int right = height.length-1;
        int sum = 0;
        while (left < right) {
            int tem = Math.min(height[left], height[right]) * (right - left);
            if (sum < tem) {
                sum = tem;
            }
            if (height[left]

你可能感兴趣的:(LeetCode_Java版,leetcode,算法,贪心算法)