LeetCode:Container With Most Water
2014-06-29 22:01
513 查看
LeetCode:Container With Most Water
题目链接Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai). n vertical 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.
算法1:枚举容器的两个边界,时间复杂度O(n^2)。大数据超时
构建结构体包含height和height在原数组中的位置
struct Node
{
int height;
int index;
};
对该结构体数组按照height的值递增排序,假设排序后的数组为vec.
假设f[i] 表示数组vec[i,i+1,…]内所有height按照原来的位置顺序排列好以后的最大水量
那么f[i-1]可以在O(1)时间内计算出来:因为vec[i-1].height 小于vec[i,i+1,…]内的所有height,所以以vec[i-1].index为边界的容器高度为vec[i-1].height,最大水量只需要分别计算vec[i,i+1,…]内按原始位置排列最前面和最后面的height,取两者的较大值。即下图中,黑色是最低的,要计算以黑色为边界的容器的最大水量,只需要分别和第一个和最后一个计算,去两者较大值
正确性证明:由于水的容量是有较小的那个边界决定的,因此某次迭代中,假设height[i] < height[j],那么j 减小肯定不会使水的容量增大,只有i 增加才有可能使水的容量增大。但是会不会有这种可能:当前的i 和 某个k (k > j)是最大容量, 这也是不可能的,因为按照我们的移动规则,既然右指针从k 移动到了j,说明i 的左边一定存在一个边界 m,使m > k,那么[m, k]的容量肯定大于[i, k],所以[i,k]不可能是最大容量。可以参考here
相关文章推荐
- leetcode (11) - Container With Most Water
- leetcode——Container With Most Water
- [LeetCode22]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
- 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
- LeetCode_Container With Most Water
- 【leetcode】Array——Container With Most Water(11)
- 【leetcode】Container with most water--python实现
- leetcode 011 —— Container With Most Water
- [LeetCode]Container With Most Water
- [LeetCode][Java] Container With Most Water