编程题—leetcode42:接雨水

题目链接

题目描述
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,
计算按此排列的柱子,下雨之后能接多少雨水。

在这里插入图片描述

上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。

示例:

输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目分析
1、我们可以按列进行分析,用一个循环来循环每一列
2、循环到第i列的时候,左边有一个最大值max_left和右边右边有一个最大值max_right,我们可以发现,只有当height[i]都小于上面的这两个值的时候才会有雨水积累
3、写出代码,可以发现max_left我们可以在遍历height的时候就可以随手记录,但max_right却需要不断的循环
//代码1
class Solution {
    public int trap(int[] height) {
    	int res=0;
    	int max_left=0;
    	int max_right=0;
    	for(int  i=0;i<height.length;i++) {
    		max_right=0;
    		for(int j=height.length-1;j>i;j--) {
    			if (height[j]>=max_right) {
    				max_right=height[j];
    			}
    		}
    		if ((max_left>height[i])&&(max_right>height[i])){
    			res+=Math.min(max_left, max_right)-height[i];
    		}
    		if(height[i]>max_left) max_left=height[i];
    	}
    	return res;
    }
}
由于上面的max_right需要我们每次循环进行判断,所以我们在想能不能max_right和max_left一样,仅仅遍历一遍就可以确定它的值
1、在右边高的时候从左往右遍历
2、在左边高的时候从右往左遍历
//代码2:双指针法
class Solution {
    public int trap(int[] height) {
    	int res=0;
    	int left=1;
    	int right=height.length-2;
    	int max_left=0;
    	int max_right=0;
    	while(left<=right) {
    		if (height[left-1]<height[right+1]) {
    			//从左往右算
    			max_left=Math.max(max_left, height[left-1]);
    			int min=max_left;
    			if(height[left]<min) {
    				res+=max_left-height[left];
    			}
    			left++;
    		}else {
    			//从右往左更
    			max_right=Math.max(max_right, height[right+1]);
    			int min=max_right;
    			if(height[right]<min) {
    				res+=max_right-height[right];
    			}
    			right--;
    		}
    	}
    	return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值