力扣第11题:盛最多水的容器
·
问题:给定 n 条垂直线,找出两条线与 x 轴共同构成的容器可以容纳最多的水。
双指针解法思路:
-
left指针从数组开头开始,right指针从数组末尾开始 -
计算当前容器的面积:
min(height[left], height[right]) * (right - left) -
移动高度较小的指针(因为容器的盛水量由较短的边决定)
代码优化建议
c
int maxArea(int* height, int heightSize) {
int left = 0;
int right = heightSize - 1;
int maxWater = 0;
while (left < right) {
// 直接计算宽度,避免中间变量
int currentWater = (height[left] < height[right] ? height[left] : height[right]) * (right - left);
if (currentWater > maxWater) {
maxWater = currentWater;
}
// 移动较短的指针
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return maxWater;
}
算法正确性证明
为什么移动较短指针的策略是正确的?
假设 height[left] < height[right]:
-
如果移动
right,宽度减少,且高度不会超过height[left],面积只会更小 -
如果移动
left,虽然宽度减少,但可能找到更高的柱子,从而可能获得更大的面积
因此,总是移动较短指针的策略不会错过最优解。
时间复杂度:O(n)
空间复杂度:O(1)
更多推荐

所有评论(0)