容器盛水问题

题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 left_Height= arr[l];
        int right_Height = arr[r];
        long v = 0;
        while(l<r){
            // 若左指针数字较小
            if(left_Height<right_Height ){
                // 从最低边界开始遍历,若比最低边界还低,则累加水量
                while(arr[l]<= left_Height && l<r){
                    v += left_Height -arr[l] ;
                    l++; // 更新左侧最高的柱子
                }
            }else{
                while(l<r && arr[r]<= right_Height ){
                	v+= right_Height - arr[r]
                	r--;
                }
            }
            
        }
        return v;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值