Container With Most Water

来源:互联网 发布:筛选出的数据求和 编辑:程序博客网 时间:2024/05/17 22:07

原题链接:https://leetcode.com/problems/container-with-most-water/description/


思路:这道题说白了就是求(j-i)*min(height[j],height[i])的最大值,其中i,j在[0,height.length-1]中。如果暴力破解一共要算n^2个值找出最大的,算法的目的就是减少需要计算的值,也就是说剔除掉肯定不是最大值的情况。我们观察这个式子有两部分组成,一部分是坐标差,一部分是min(height[j],height[i]),如果i,j变化了之后j-i变小,同时min(height[j],height[i])没有变大。那么这种情况下两部分相乘的值肯定没有变化前的值大,即可以剔除这种情况。


我们把两指针i和j放在数组首尾,每次找出较小指的指针向内移动,知道两指针相遇为止。那么最大值一定出现在这段过程中,因为如果是较大值的那个指针向内移动的话,j-i变小,同时min(height[j],height[i])可能会变小可能会不变,反正不可能变大,所以两部分相乘一定是会变小的,肯定不会是整个过程中的最大值。


public class ContainerWithMostWater {    public int maxArea(int[] height) {        int left = 0;        int right = height.length-1;        int maxArea = (right-left) * Math.min(height[left], height[right]);        while(left < right) {        if(height[left] < height[right]) {        left++;        } else {        right--;        }        int temp = (right-left) * Math.min(height[left], height[right]);        maxArea = Math.max(maxArea, temp);        }        return maxArea;    }}




原创粉丝点击