LeetCode11-Container With Most Water
Posted jianzs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode11-Container With Most Water相关的知识,希望对你有一定的参考价值。
LeetCode11-Container With Most Water
两点法,规定两点构建初始枚举范围,然后通过题目特点,移动(舍弃)其中一点,缩小枚举范围,直至不能继续枚举。比较过程中产生的结果值,得到正确答案。
题目链接: https://leetcode.com/problems/container-with-most-water/
1 题面
Given n non-negative integers a1, a2, ..., an , where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.
Note: You may not slant the container and n is at least 2.
The above vertical lines are represented by array [1,8,6,2,5,4,8,3,7]. In this case, the max area of water (blue section) the container can contain is 49.
2 题意
n 个非负整数 a1, a2, a3, ..., an,分别表示 n 个不同高度的垂直线,水平间隔为 1。 面积等于两根垂直线之间的水平距离与短边构成的矩形面积。求最大面积。
3 方法
3.1 暴力
在 LeetCode 上,这道题通过两两暴力枚举是可以 AC 的,复杂度 O(N^2),暴力就没啥好说的了。
int maxArea(vector<int>& height) {
int maxA = 0;
int len = height.size();
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
int a = (j - i) * min(height[j], height[i]);
maxA = max(a, maxA);
}
}
return maxA;
}
3.2 两点法
矩形面积由两边之间水平长度和短边高度决定,而这个方法就是利用不断缩小两边水平长度、舍弃短边,枚举最大面积。
首先,分别以最左和最右两条垂直线为左右两边的端点,计算面积,然后移动短边所在端点,向中间靠近一个单位,计算新的面积,与之前面积比较并取大。
之所以移动短边端点,而不移动长边端点,是因为进一步枚举,势必缩短水平长度,如果移动长边,矩阵高度只会保持或减小,所以面积只可能缩小;而移动短边,矩阵高度可能会增加,虽然水平长度减小,但面积仍有可能增大。
int maxArea(vector<int>& height) {
int maxA = 0;
int l = 0;
int r = height.size() - 1;
while (l < r) {
int a = (r - l) * min (height[l], height[r]);
maxA = max(a, maxA);
if (height[l] < height[r])
l++;
else
r--;
}
return maxA;
}
以上是关于LeetCode11-Container With Most Water的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode11. Container With Most Water 解题报告
LeetCode?????????python?????????11. Container With Most Water
LeetCode 11. Container With Most Water
leetcode_11. Container With Most Water