Leetcode11. 盛最多水的容器
题目:
给你
n
n
n 个非负整数
a
1
,
a
2
,
.
.
.
,
a
n
a_1,a_2,...,a_n
a1,a2,...,an,每个数代表坐标中的一个点
(
i
,
a
i
)
(i, a_i)
(i,ai) 。在坐标内画
n
n
n 条垂直线,垂直线 i 的两个端点分别为
(
i
,
a
i
)
(i, a_i)
(i,ai) 和
(
i
,
0
)
(i, 0)
(i,0)。找出其中的两条线,使得它们与
x
x
x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且
n
n
n 的值至少为
2
2
2。
题解:
使用双指针方法:
设双指针
i
,
j
i,j
i,j分别为容器的两端;
1.若向内移动短板,水槽的短板
m
i
n
(
h
[
i
]
,
h
[
j
]
)
min(h[i], h[j])
min(h[i],h[j]) 可能变大,因此水槽面积
S
(
i
,
j
)
S(i, j)
S(i,j) 可能增大。
2.若向内移动长板,水槽的短板
m
i
n
(
h
[
i
]
,
h
[
j
]
)
min(h[i], h[j])
min(h[i],h[j])不变或变小,下个水槽的面积一定小于当前水槽面积。
因此,向内收窄短板可以获取面积最大值。换个角度理解:
- 如果 h e i g h t ( i ) < h e i g h t ( j ) height(i)<height(j) height(i)<height(j),则移动 i i i 到 i + 1 i+1 i+1
- 如果 h e i g h t ( i ) > = h e i g h t ( j ) height(i)>=height(j) height(i)>=height(j),则移动 j j j 到 j − 1 j-1 j−1
java 代码:
public static int maxArea(int[] height) {
int l = 0;
int r = height.length;
int maxArea = 0;
while (l < r) {
if (height[l] < height[r]) {
maxArea = Math.max(maxArea, (r - l) * height[l]);
l++;
} else {
maxArea = Math.max(maxArea, (r - l) * height[r]);
r--;
}
}
return maxArea;
}
scala代码:
def maxArea(height: Array[Int]): Int = {
var i = 0
var j = height.length - 1
var area = 0
while (i < j) {
if (height(i) < height(j)) {
area = math.max(area, (j - i) * height(i))
i = i + 1
} else {
area = math.max(area, (j - i) * height(j))
j = j - 1
}
}
area
}