11题:盛最多水的容器O(n)

这道题目是力扣(LeetCode)上的问题,要求找出两条垂直线构成的容器,能容纳最多的水。问题本质是求二维平面上两点间的最大面积。解题策略是从短板开始向中间遍历,避免重复计算,以提高效率。2020年6月26日的优化加入了guard变量,用于避免不必要的计算。

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

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
//
说明:你不能倾斜容器,且 n 的值至少为 2。
题目图片
//
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/container-with-most-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这道题本质是求面积。假设容器一开始具有最大的宽度0到(len-1),但是两边不固定。如果容器较短的一边不变,即使另一条边再高,也无法扩大面积,即容器的短板会限制面积改变。所以从短板那一边开始往中间选择新的边,只有这个方向才存在求得更大面积的可能性。求出最大面积只需一次遍历。

func maxArea(height []int) int {
	max, temp, guard := 0, 0, 0
	for l, r := 0, len(height)-1; l < r; {
        guard = int(math.Min(float64(height[l]), float64(height[r])))
		temp = (r - l) * guard
		if temp > max {
			max = temp
		}
		if height[l] <= height[r] {
			for l++; l < r && guard >= height[l]; l++ {
			}
		} else if height[l] > height[r] {
			for r--; l < r && guard >= height[r]; r-- {
			}
		}
	}
	return max
}

2020年6月26日修改,增设一个guard,当计算结果不比max大的时候,可以当遍历条件的参考值,避免重复计算比guard小的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值