本文已参与「新人创作礼」活动,一起开启掘金创作之路。
盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例 1:
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
输入:height = [1,1]
输出:1
提示:
- n == height.length
- 2 <= n <= 10^5
- 0 <= height[i] <= 10^4
解题思路
定义两个指针(可以是数组下标),初始分别指向高度数组的首和尾。 然后遵循前面的指针往后移,后面的指针往前移的原则。每次只移动一个指针,看哪个指针指向的高度较小,就移动哪个指针,每移动一次就进行一次最大容积的更新。🌟每次都移动指向较小高度的指针的理由:因为较小高度决定了容器的高度,每次移动都是容器宽度变小的过程,只有导致容器高度增加的移动,才是增加容积的移动。如果移动的是指向较大高度的指针,则不会改变容器的高度,只会减少容易的宽度,从而一定会减少容器的容积。
代码实现
int maxArea(int* height, int heightSize){
int i = 0, j = heightSize - 1; // 分别指向数组的首尾元素
int temp, s = (j - i) * ((height[i] < height[j]) ? height[i] : height[j]);
while(j>i){
if(height[i]<height[j]){
i++;
temp = (j - i) * ((height[i] < height[j]) ? height[i] : height[j]);
s = (temp > s) ? temp : s;
}
else{
j--;
temp = (j - i) * ((height[i] < height[j]) ? height[i] : height[j]);
s = (temp > s) ? temp : s;
}
}
return s;
}
总结
其实不用有些题解说的那么复杂,双指针就行了~