文章目录
11. 开发公司盛最多水的容器:
开发公司给定一个长度为 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。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
样例 2:
输入: height = [1,1]输出: 1
- 1
- 2
- 3
- 4
- 5
提示:
- n == height.length
- 2 <= n <= 105
- 0 <= height[i] <= 104
原题传送门:
分析
- 面对这道算法题目,二当家的陷入了沉思。
- 最终放多少水,只和宽度,高度有关。
- 由于有两个变量,所以很难一下判断如何才能最大。
- 我们不妨先让一个量最大,这样结果就只和另一个量有关了。
- 我们先取最左和最右两个端点构成容器,这时候容器的宽度最大,高度只能是两个端点较小的一个,记录下来盛水量。
- 下一步,我们将较小的一个端点向中间移动,宽度会缩小,所以我们希望能找到更高的端点,如果移动较高的端点,那么容器的高度不会变高,因为被低的那个端点限制了,所以我们应该移动那个低的端点,这样才有希望找到更高的端点,使得容器整体变高。
题解
impl Solution { pub fn max_area(height: Vec<i32>) -> i32 { let mut maxArea = 0; let mut l = 0; let mut r = height.len() - 1; while l < r { let mut area; if height[l] < height[r] { area = (r - l) as i32 * height[l]; l += 1; } else { area = (r - l) as i32 * height[r]; r -= 1; } maxArea = maxArea.max(area); } return maxArea; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
go
func maxArea(height []int) int { maxArea := 0 l := 0 r := len(height) - 1 for l < r { var area int if height[l] < height[r] { area = (r - l) * height[l] l++ } else { area = (r - l) * height[r] r-- } if area > maxArea { maxArea = area } } return maxArea}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
c++
class Solution {public: int maxArea(vector<int>& height) { int maxArea = 0; int l = 0, r = height.size() - 1; while (l < r) { int area; if (height[l] < height[r]) { area = (r - l) * height[l++]; } else { area = (r - l) * height[r--]; } maxArea = max(maxArea, area); } return maxArea; }};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
java
class Solution { public int maxArea(int[] height) { int maxArea = 0; int l = 0, r = height.length - 1; while (l < r) { int area; if (height[l] < height[r]) { area = (r - l) * height[l++]; } else { area = (r - l) * height[r--]; } maxArea = Math.max(maxArea, area); } return maxArea; }}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
typescript
function maxArea(height: number[]): number { let maxArea = 0; let l = 0, r = height.length - 1; while (l < r) { let area; if (height[l] < height[r]) { area = (r - l) * height[l++]; } else { area = (r - l) * height[r--]; } maxArea = Math.max(maxArea, area); } return maxArea;};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
python
class Solution: def maxArea(self, height: List[int]) -> int: l, r = 0, len(height) - 1 ans = 0 while l < r: if height[l] < height[r]: area = (r - l) * height[l] l += 1 else: area = (r - l) * height[r] r -= 1 ans = max(ans, area) return ans
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
非常感谢你阅读本文~
欢迎【点赞】【收藏】【评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 博客原创~