盛最多水的容器
盛最多水的容器
作者:Grey
原文地址:
题目描述
LeetCode 11. Container With Most Water
思路
使用双指针,设置两个指针,假设数组长度为len
,
左指针l
从0
位置开始,右指针r
从len-1
开始,
则height[l]
和height[r]
无非有如下几种情况:
// 情况1
height[r] < height[l]
// 情况2
height[r] == height[l]
// 情况3
height[r] > height[l]
对于情况1,我们可以这样考虑,不管区间l...r
之间的值有哪些,我至少可以确保如果横线划在height[r]
位置,可以收获
(r - l) * height[r]
如下示意图
这么多雨水,然后r指针向右移动。
情况3同理,不管l...r
之间的值有哪些,我至少可以确保如果横线划在height[l]
位置,可以收获
(r - l) * height[l]
如下示意图
这么多雨水,然后l
指针向左移动。
对于情况2,其实也可以归结到上面任何一种情况中,假设我归结在情况3中,那么对于情况2和情况3,统一可以获得的最大雨水量是:
(r - l) * height[l]
然后l指针向左移动。
结束的条件是当l
和r
相等的时候,每一次移动l
或者r
都收集一遍,并且和最大值max
比较,最后返回max
的值即可。
整个算法的时间复杂度是O(N)
,空间复杂度是O(1)
。
完整代码
public static int maxArea(int[] heights) {
if (null == heights || heights.length == 1) {
return 0;
}
int l = 0;
int r = heights.length - 1;
int w;
int max = 0;
while (l < r) {
if (heights[r] < heights[l]) {
w = (r - l) * heights[r];
r--;
} else {
w = (r - l) * heights[l];
l++;
}
max = Math.max(max, w);
}
return max;
}
更多
本文来自博客园,作者:Grey Zeng,转载请注明原文链接:https://www.cnblogs.com/greyzeng/p/5918205.html