Container With Most Water

本文针对LeetCode上的容器盛水问题提出了一种高效算法。通过双指针技巧从两端逐步向中间逼近,避免了不必要的计算,确保找到最大水量的同时保持了良好的算法效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接: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;
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值