LeetCode-Container With Most Water
2013-07-09 20:01
489 查看
解法一:先甄选出可能成为起始点的候选点以及可能成为终止点的候选点(起止点的左侧不可能有比自身大的只,终止点的右侧不能有比自身要小的值),然后对这些点进行二重循环遍历,时间复杂度不是线性的
解法二:贪心算法,可以在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 //直接二重循环遍历的话,时间上会超出,所以要优化时间 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; } };
相关文章推荐
- Leetcode练习 #11 Container With Most Water
- leetcode Container With Most Water python
- [LeetCode] Container With Most Water 装最多水的容器
- 7_leetcode_container with most water
- Leetcode-Container With Most Water
- LeetCode---Container With Most Water(11)
- [leetcode 11]Container With Most Water
- 【LeetCode】Container With Most Water 解题报告
- LeetCode之11---Container With Most Water
- [leetcode javascript解题]Container With Most Water
- LeetCode-011 Container With Most Water
- leetcode——Container With Most Water
- leetcode:Container With Most Water
- LeetCode:Container With Most Water
- LeetCode Container With Most Water
- [LeetCode] Container With Most Water
- leetcode 11:Container With Most Water
- leetcode Container With Most Water 难度系数3 3.4
- leetcode Container With Most Water(Java)
- Container With Most Water - LeetCode 11