LeetCode 11. Container With Most Water
题目要求:给出n个非负的整数a1,a2,… an。分别得到n个点(i,ai)。每个点(i,ai)与x轴上对应的点(i,0)组成一条垂直于x轴的线段。求任意两条直线以及x轴形成的最大容器体积。
容器的体积为对应两条线段之间的距离乘以较小的线段长度。
解题思路
一开始用的是最蠢的方法,即使用双重循环,对任意两条边进行比较,然后华丽丽地超时了。看了一下其他人的做法,此题需使用贪心算法。
- 用max记录容器最大体积,用temp记录当前容器体积;
- 初始化两条线段的位置为i=0和j=height.size()-1;
- 此时是左边的线段i向右移动还是右边的线段j向左移动呢?既然横竖容器的宽度都要减1,那么就让高度尽可能高,所以height[i]和height[j]谁比较小谁就往中间移动。直到最后i>=j。
代码实现如下:
class Solution {
public:
int maxArea(vector<int>& height) {
int i = 0;
int j = height.size() - 1;
int max = 0;
int temp = 0;
while (i < j) {
temp = (j - i)*min(height[i], height[j]);
if (max < temp)
max = temp;
if (height[i] < height[j])
i++;
else
j--;
}
return max;
}
};