BM94 题解 | #接雨水问题#
接雨水问题
https://www.nowcoder.com/practice/31c1aed01b394f0b8b7734de0324e00f
解题心得:
终于总算是彻底理解了这道题的意思,这道题的解法了,以前总是看不懂,现在彻底理解了,很简单,你就把数组的left、right边缘节点,看作是桶的边界,之后,这个边界还是动态更新的!
解题思路:
1、桶的盛水量由桶当前遍历的arr[left]、arr[right]的大小决定的,也就是桶高。
2、在遍历left、right的过程中,其实只走一遍的,要么走左,要么走右,
这样就可以快速的确定,可以盛水的地方。
3、也就是可以在一边往左边走,或者右边走的过程中,确定可盛的水量了。
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* max water
* @param arr int整型一维数组 the array
* @return long长整型
*/
public long maxWater (int[] arr) {
if(arr.length<2) {
return 0;
}
int left = 0;
int right = arr.length -1;
long water = 0;
int maxL = 0, maxR = 0; // 左边、右边最大高度
while(left< right) {
maxL = Math.max(maxL, arr[left]);
maxR = Math.max(maxR, arr[right]);
if(maxR > maxL) {
water += maxL - arr[left++];
} else {
water += maxR - arr[right--];
}
}
return water;
}
}
查看30道真题和解析