容器盛水问题
作者:互联网
题1:盛最多水的容器
解题:双指针
- 初始两个左右指针,可容纳水量
min(左指针,右指针)*指针间距
S(i, j) = min(h[i], h[j]) × (j - i)
- 移动数字较小的指针,
min(h[i],h[j])
可能变大
public class Solution {
public int maxArea(int[] height) {
int left = 0;
int right = height.length-1;
int vomumn = 0;
while(left < right ){
int area = Math.min(height[left ],height[right ])*(right -left)
volumn = Math.max(volumn,area)
// 移动较小的数字指针
if(height[left]< =height[righ]){
++left
}else{
-- right
}
}
return volumn
}
题2:容器盛水问题
public long maxWater (int[] arr) {
// write code here
int l =0;
int r = arr.length-1;
int i= l;
int j = r;
long v = 0;
while(i<j){
// 若左指针数字较小
if(arr[l]<arr[r]){
// 从最低边界开始遍历,若比最低边界还低,则累加水量
if(arr[++i] <arr[l]){
v += arr[l]-arr[i];
}else{
// 若大于最低边界,则更新边界值
l=i;
}
}else{
if(arr[--i] <arr[l]){
v += arr[r]-arr[j];
}else{
r=j;
}
}
}
return v;
}
标签:容器,arr,right,盛水,int,height,问题,left,指针 来源: https://blog.csdn.net/Mikon_0703/article/details/117478794