11. 盛水最多的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
Java版:
暴力双指针(超时):
class Solution {
public int maxArea(int[] height) {
int length = height.length;
int max = 0;
for (int i = 0, j = 1; i < length - 1; ) {
int area = (j - i) * Math.min(height[i], height[j]);
if (area > max) {
max = area;
}
j++;
if (j == length) {
i++;
j = i + 1;
}
}
return max;
}
}
偷的自己改进了:
class Solution {
public int maxArea(int[] height) {
int length = height.length;
int left = 0, right = length - 1;
int area = 0;
while (left < right) {
if (height[left] > height[right]) {
area = Math.max(area, (right - left) * height[right]);
right--;
} else {
area = Math.max(area, (right - left) * height[left]);
left++;
}
}
return area;
}
}
Go版:
func maxArea(height []int) int {
length := len(height)
left := 0
right := length - 1
area := 0
for left < right {
if height[left] > height[right] {
area = max(area, (right - left) * height[right])
right--
} else {
area = max(area, (right - left) * height[left])
left++
}
}
return area
}
func min(a int, b int) int {
if a > b{
return b
}
return a
}
func max(a int, b int) int {
if a > b{
return a
}
return b
}
总结
写了这么几天,感觉解题思路变快了不少,感觉有点入门了。