leetcode 42. 接雨水
一、前言
今天刷了一道个人觉得好难的leetcode题目(大神可以忽略)
二丶题目
42. 接雨水
给定 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
三、个人解法
class Solution { public int trap(int[] height) { if(height==null || height.length<=2){ return 0; } int total=0; int left=0; //左低右高 for(int i=0;i<height.length;i++){ if(height[left]<=height[i]){//计算赋值 //判断是否符合"凹"型(可以装水) if(left+2<=i && height[left]>height[left+1] && height[i]>height[i-1]){ int tmpTotal=0; for(int j=left+1;j<i;j++){ tmpTotal+=height[j]; } //积水量=补平最高位后的总量 - 台阶占用空间 total=total+(height[left]*(i-left-1) - tmpTotal); } left=i; } } //左高右低 int right=height.length-1; for(int i=right;i>=left;i--){ if(height[right]<=height[i]){//计算赋值 if(i+2<=right && height[i]>height[i+1] && height[right]>height[right-1]){ int tmpTotal=0; for(int j=i+1;j<right;j++){ tmpTotal+=height[j]; } total=total+(height[right]*(right-i-1) - tmpTotal); } right=i; } } return total; } }