LeetCode 11. 盛最多水的容器
题目描述
思路分析
在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽的底边宽度变短。 若向内移动短板,水槽的短板
min(h[i], h[j])
可能变大,因此下个水槽的面积可能增大。 若向内移动长板,水槽的短板min(h[i], h[j])
不变或变小,因此下个水槽的面积一定变小。
解题思路:
- 使用双指针法,一个指针从数组的开头开始,一个指针从数组的末尾开始。
- 计算指针所指的两条线构成的容器的面积,面积等于两条线之间的距离乘以两条线中较短的线的高度。
- 比较两条线中较短的线,将较短的线所在的指针向内移动一个位置,因为移动较长的线不会让容器的面积增大,而移动较短的线可能会使容器的面积增大。
- 继续计算移动后两指针所指的容器的面积,更新最大面积。
- 重复步骤 3 和步骤 4,直到两指针相遇。
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
func maxArea(height []int) int {
left, right := 0, len(height)-1
res := 0
for left < right {
if height[left] < height[right] {
res = max(res, height[left]*(right-left))
left++
} else {
res = max(res, height[right]*(right-left))
right--
}
}
return res
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int maxArea(int[] height) {
int left = 0, right = height.length - 1;
int res = 0;
while (left < right) {
if (height[left] < height[right]) {
res = Math.max(res, height[left] * (right - left));
left++;
} else {
res = Math.max(res, height[right] * (right - left));
right--;
}
}
return res;
}
}
CC BY-NC-SA 4.0
许可协议,转载请注明出处!
本博客所有文章除特别声明外,均采用