其他分享
首页 > 其他分享> > 容器盛水问题

容器盛水问题

作者:互联网

题1:盛最多水的容器

在这里插入图片描述

解题:双指针

  1. 初始两个左右指针,可容纳水量min(左指针,右指针)*指针间距
    S(i, j) = min(h[i], h[j]) × (j - i)
  2. 移动数字较小的指针,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