力扣11:盛最多水的容器(面试得到没写出来)

力扣11:盛最多水的容器(面试得到没写出来)

lucas Lv4

题目

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。

示例一

1.jpg

输入:[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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
fun maxArea(height: IntArray): Int {
var left = 0
var right = height.size - 1
var areaMax = 0
var areaNow: Int
var needMove: Int
while (right > left) {
needMove = minOf(height[left], height[right])
areaNow = minOf(height[left], height[right]) * (right - left)
if (areaNow > areaMax) {
areaMax = areaNow
}
if (height[right] == needMove) {
right--
} else {
left++
}
}
return areaMax
}
}

复杂度分析

时间复杂度为 O(n),空间复杂度为 O(1)

总结

这种题其实不难,只是算法不经常练,所以才会导致没有办法在短时间内做出来,所以算法还得靠积累总结,当然最重要的多练!!!

  • Title: 力扣11:盛最多水的容器(面试得到没写出来)
  • Author: lucas
  • Created at : 2023-04-18 17:20:43
  • Updated at : 2023-11-14 20:43:06
  • Link: https://darkflamemasterdev.github.io/2023/04/18/力扣11:盛最多水的容器(面试得到没写出来)/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments
On this page
力扣11:盛最多水的容器(面试得到没写出来)