本文共 1227 字,大约阅读时间需要 4 分钟。
给定 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却需要不断的循环
//代码1class Solution { public int trap(int[] height) { int res=0; int max_left=0; int max_right=0; for(int i=0;ii;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]