您的位置:首页 > 大数据 > 人工智能

LeetCode-Container With Most Water

2013-07-09 20:01 489 查看
解法一:先甄选出可能成为起始点的候选点以及可能成为终止点的候选点(起止点的左侧不可能有比自身大的只,终止点的右侧不能有比自身要小的值),然后对这些点进行二重循环遍历,时间复杂度不是线性的

class Solution {
public:
int maxArea(vector<int> &height) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
//直接二重循环遍历的话,时间上会超出,所以要优化时间
if (height.size() <= 1)
{
return 0;
}
int ans = 0;
vector<int> begPoints, endPoints;
int maxHeight = -1;
//将可能成为起点的候选点下标放入begPoints
for (vector<int>::size_type i = 0; i < height.size() - 1; ++i)
{
if (height[i] > maxHeight)
{
begPoints.push_back(i);
maxHeight = height[i];
}
}
maxHeight = -1;
//将可能成为终止点的候选点下标放入endPoints
for (vector<int>::size_type i = height.size() - 1; i > 0; --i)
{
if (height[i] > maxHeight)
{
endPoints.push_back(i);
maxHeight = height[i];
}
}
int len = endPoints.size();
//遍历begPoints和endPoints,找出最大面积的矩形
for (vector<int>::size_type i = 0; i < begPoints.size(); ++i)
{
for (vector<int>::size_type j = 0; j < endPoints.size(); ++j)
{
int lHeight = height[begPoints[i]], rHeight = height[endPoints[j]];
int h = min(lHeight, rHeight) * (endPoints[j] - begPoints[i]);
ans = max(ans, h);
}
}
return ans;
}
};


解法二:贪心算法,可以在O(n)时间内解决。设置两个指针i和j,从两端开始向中间靠拢,至于是左指针++还是右指针--,取决于二者指向的值height[i]和height[j]谁更小(高度)。要记住一点,在遍历的任意时刻,若某个指针指向的值偏小,则另外一个指针指向的值一定是两个指针遍历过的所有值中最大的,这也是为什么向中间靠拢是正确的依据。比如为何在height[ i ] < height[ j ]时要执行++i而不是--i来试探呢? 假设存在i' < i, 并设height[ i' ] > height[ i
]。则i' 向右移动的原因是存在j' >= j, 有height[ j' ] > height[ i' ]。设area' = (j' - i') * min(height[ i' ], height[ j' ]) = (j' - i') * height[ i' ] , area = (j - i') * min(height[ i' ], height[ j ]) = (j - i') * height[ i' ] (注意,height[ j ]是目前两个指针遍历过的所有值中的最大的),所以有area <=
area' 。注意,我们已经遍历过i'和j'从而得到area'值,并与我们那时的最大值比较过了,所以,此时的area一定不是最大值(至少不超过目前的面积最大值),也就是说指针i向左移动得到的面积值绝对不会是解,所以我们无须担心,可以大胆地把i向右移动。

class Solution {
public:
int maxArea(vector<int> &height) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int ans = 0;
if (height.size() < 2)
return ans;
int i = 0, j = height.size() - 1;
while (i < j)
{
ans = max(ans, (j - i) * min(height[i], height[j]));
if (height[i] < height[j])
++i;
else
--j;
}
return ans;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: