11 Container With Most Water

Medium

Given n non-negative integers a1, a2, …, an , where each represents a point at coordinate (i, ai). nvertical 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.

img

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.

Example:

1
2
Input: [1,8,6,2,5,4,8,3,7]
Output: 49

给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

img

图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。

示例:

1
2
输入: [1,8,6,2,5,4,8,3,7]
输出: 49

想法

参考Solution做的……具体就是用双指针来扫描,从两端开始,如果$a_{left} < a_{right}$则使左指针+1,若$a_{left} > a_{right}​$则使右指针-1。证明在Solution里有……

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
int maxArea(vector<int> &height)
{
int l = 0, r = height.size() - 1;
int maxValue = 0;
while (l < r) {
maxValue = max(maxValue, (r - l) * min(height[l], height[r]));
if (height[l] < height[r]) {
l++;
}
else {
r--;
}
}
return maxValue;
}
};

int main(void)
{
vector<int> v({1, 8, 6, 2, 5, 4, 8, 3, 7});
Solution s;
cout << s.maxArea(v) << endl;
return 0;
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×