[leetcode]_Container With Most Water
2014-05-29 09:59
344 查看
题目:在二维坐标系下,有很多个挡板,有两个挡板之间能够积蓄的水的最大面积。如下图所示:
思路:我只想到暴力解法,用O(n2)的时间复杂度算出任意两个挡板形成的面积,这必须的过不了。
优化解法:O(n).
用两个指针 i 和 j 指向整个height[]数组的头尾。
if i 指向的高度 < j 指向的高度 , then 用 i 指向的高度 * i , j之间的距离 求的面积,i 指针向后移。
(i指针向后移的原因:因为当前的面积由i 的高度决定,相当于现在获得以i指针为一边挡板的最大面积,因为随着j的向内移动,水平宽度肯定是降低的,然后及时j的高度高于i的高度,也因为矩形面积由短板边<i的高度>决定,因此不会比现在的面积更大。)
同理如果 j 指向的高度 < i 指向的高度, 将j指针向内移动。
代码:
这种精妙的算法,代码很简单,思路很难想到。即使知道了正确解法,还是觉得心有不安。待下次遇见类似问题再深化思考吧。
思路:我只想到暴力解法,用O(n2)的时间复杂度算出任意两个挡板形成的面积,这必须的过不了。
优化解法:O(n).
用两个指针 i 和 j 指向整个height[]数组的头尾。
if i 指向的高度 < j 指向的高度 , then 用 i 指向的高度 * i , j之间的距离 求的面积,i 指针向后移。
(i指针向后移的原因:因为当前的面积由i 的高度决定,相当于现在获得以i指针为一边挡板的最大面积,因为随着j的向内移动,水平宽度肯定是降低的,然后及时j的高度高于i的高度,也因为矩形面积由短板边<i的高度>决定,因此不会比现在的面积更大。)
同理如果 j 指向的高度 < i 指向的高度, 将j指针向内移动。
代码:
public int maxArea(int[] height) { int i = 0 , j = height.length - 1; int max = 0 ; while(i < j){ int tempArea = 0; if(height[i] < height[j]){ tempArea = height[i]*(j - i); i++; }else{ tempArea = height[j]*(j - i); j--; } if(tempArea > max) max = tempArea; } return max; }
这种精妙的算法,代码很简单,思路很难想到。即使知道了正确解法,还是觉得心有不安。待下次遇见类似问题再深化思考吧。
相关文章推荐
- 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(C++解法)
- LeetCode 11 Container With Most Water(最大水容器)
- leetcode——Container With Most Water
- leetcode-Container With Most Water
- [LeetCode]Container With Most Water、Trapping Rain Water
- Leetcode 11 Container With Most Water
- LeetCode:Container With Most Water
- LeetCode Container With Most Water
- LeetCode 11 Container With Most Water (C,C++,Java,Python)
- LeetCode 11 -- Container With Most Water
- leetcode-java.T011_ContainerWithMostWater 找两条竖线然后这两条线以及X轴构成的容器能容纳最多的水
- LeetCode Container With Most Water
- Container With Most Water —— Leetcode
- [LeetCode] Container With Most Water 简要分析
- [LeetCode-Algorithms-11] "Container With Most Water" (2017.10.2-WEEK5)
- [Leetcode] Container With Most Water