力扣11:盛最多水的容器(面试得到没写出来)
题目
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例一
输入:[1,8,6,2,5,4,8,3,7]
输出:49
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例二
输入:height = [1,1]
输出:1
提示
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
分析
输入一个数组 height[] ,找两个数 height[i] 和 height[j], i < j ,返回 (j - i) * minOf(height[i], height[j])
我们可以使用双指针(一左一右),并每次都移动小的那个指针,即可,因为只有移动小的指针,才可能会比现在的结果大。
举个例子:
[1, *, *, *, *, *, *, *, 7]
我们在计算出 1,7 这两个数的结果(7-1) * minOf(1,7) = 6
后,如果想要找更大的结果,只能移动将指向 1 的指针向右移动,因为无论移动那个指针都会缩短两指针之间的距离,而结果是两部分的乘积,所以需要将 minOf(1,7) 变大,只有将最小值变大 minOf() 才会变大
相反,如果是[6, *, *, *, *, *, *, *, 2]
,肯定就是移动指向 2 的指针,因为此时 改变 2 才有可能将 minOf() 变大
代码
然后我们的代码就是
1 | class Solution { |
复杂度分析
时间复杂度为 O(n),空间复杂度为 O(1)
总结
这种题其实不难,只是算法不经常练,所以才会导致没有办法在短时间内做出来,所以算法还得靠积累总结,当然最重要的多练!!!
- Title: 力扣11:盛最多水的容器(面试得到没写出来)
- Author: lucas
- Created at : 2023-04-18 17:20:43
- Updated at : 2024-11-14 08:17:02
- Link: https://darkflamemasterdev.github.io/2023/04/18/力扣11:盛最多水的容器(面试得到没写出来)/
- License: This work is licensed under CC BY-NC-SA 4.0.