题意:给定一个数组,每一个元素代表容器壁的高度,两个元素的间距代表容器的宽度,找出两个数能组成成最多水的容器
比如:[1,5,1,4],当容器壁为5和4时盛水最多,最多的盛水为:Math.max(5, 4) * (3-1)= 6,其中3和1是4和5在数组中的索引
思路:
- 在数组的开始和结尾各设置一个指针;
- 指向数值较小的一边优先开始移动;
- 移动开始前先查看当前盛水是否比目前记录的最大值大,如果大则更新最大值;
- 记录开始的指针值;
- 移动指针直到找到比开始的值大的新值,因为在移动的过程中,宽度在不断减小,只有当新移动到的容器壁比最开始的容器壁高,才可能会比之前记录的值大;
思想:首尾指针法
复杂度:时间O(n),空间O(1)
class Solution {
public int maxArea(int[] height) {
int len = height.length;
int s = 0;
int e = len - 1;
int res = 0;
while(s<e) {
if(height[s]<=height[e]) {
res = Math.max(height[s] * (e-s), res);
int temp = height[s];
while(s<e && height[s] <= temp) {
s++;
}
} else {
res = Math.max(height[e] * (e-s), res);
int temp = height[e];
while(s<e && height[e] <= temp) {
e--;
}
}
}
return res;
}
}
网友评论