LeetCode 11. Container With Most Water
Posted buddho
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 11. Container With Most Water相关的知识,希望对你有一定的参考价值。
https://leetcode.com/problems/container-with-most-water/
给出一堆数,是一个一维向量上的高。求出左右两个数作为高度,最大的装水的面积。
第一种,最笨的办法,就是 轮询,o(n^2)的搜索。
一个指针指向左侧,一个指向右侧,通过枚举出所有的组合,找出最大的即可。
int maxArea(vector<int>& h) { int left ,right; int ans = 0; for(left = 0; left + 1< h.size(); left++) { for(right = left + 1; right < h.size(); right ++) { ans = max(ans, (right - left)*min(h[left],h[right])); } } return ans; }
这样的代码提交是会超时的。
第二种方法,我们让两个指针分别指向数组的头和尾,这样来遍历数组。
int maxArea_(vector<int>& h) { int ans = 0; int tmp;
// i是左侧的挡板,j是右侧挡板。 for(int i = 0, j = h.size()-1; i < j; ) {
//比较低的挡板就是那个高。 if(h[i] < h[j]) { tmp = h[i] * (j - i);
// 如果h[i]比较低的话,右侧已经无法再突破了。
// 因为移动j,容器的高高仍然是h[i],而j-i在缩短,容量只会变小。不可能找到最大值。
//所以这种情况下,移动i才有可能找到最大值。
i++; } else //另一种同理 { tmp = h[j] * (j - i); j--; } // 更新最大容量 ans = max(ans, tmp); } return ans; }
这种每次逼近的方式,类似于一个排序数组,找两个数的和等于某个数的搜索方法。利用了某种特性,最后实现是线性的复杂度。
以上是关于LeetCode 11. Container With Most Water的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode?????????python?????????11. Container With Most Water
LeetCode11. Container With Most Water 解题报告
leetcode_11. Container With Most Water
Leetcode 11. Container With Most Water (two pointers)