leetcode 11. 盛最多水的容器

127 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

盛最多水的容器

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

 

示例 1:

image.png

输入:[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;
}

总结

其实不用有些题解说的那么复杂,双指针就行了~

参考

双指针(首尾指针) - 盛最多水的容器 - 力扣(LeetCode) (leetcode-cn.com)