LeetCode第42题:接雨水(困难)
- 题目:给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
- 解法一:尝试了很多种方法,有的方法解决不了{5,1,3,2,5}的情况,有的解决不了{5,1,3,2,4}的问题,还有一个超时了。下面的情况属于后者问题,但已经是我能写出来的过的最多的答案了。。。。
class Solution {
public int trap(int[] height) {
int len=height.length;
int ans=0;
if(len<3) return ans;
int mid=0;
int start=height[0];
for(int i=1;i<len;i++){
if(height[i]<start){
mid+=start-height[i];
}else{
ans+=mid;
mid=0;
start=height[i];
}
}
return ans;
}
}
- 解法二:这种做法是寻找左右的最高值然后求当前的位置的积水量,做题的时候想到了这中方法,可是觉得循环太多了,果然运行效果也不是很好。
public int trap(int[] height) {
int sum = 0;
for (int i = 1; i < height.length - 1; i++) {
int max_left = 0;
for (int j = i - 1; j >= 0; j--) {
if (height[j] > max_left) {
max_left = height[j];
}
}
int max_right = 0;
for (int j = i + 1; j < height.length; j++) {
if (height[j] > max_right) {
max_right = height[j];
}
}
int min = Math.min(max_left, max_right);
if (min > height[i]) {
sum = sum + (min - height[i]);
}
}
return sum;
}
作者:windliang
链接:https://leetcode-cn.com/problems/trapping-rain-water/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

- 解法三:用数组记录左右的最大值,解决了方法二的循环问题,没想到执行时间少了这么多!
public int trap(int[] height) {
int sum = 0;
int[] max_left = new int[height.length];
int[] max_right = new int[height.length];
for (int i = 1; i < height.length - 1; i++) {
max_left[i] = Math.max(max_left[i - 1], height[i - 1]);
}
for (int i = height.length - 2; i >= 0; i--) {
max_right[i] = Math.max(max_right[i + 1], height[i + 1]);
}
for (int i = 1; i < height.length - 1; i++) {
int min = Math.min(max_left[i], max_right[i]);
if (min > height[i]) {
sum = sum + (min - height[i]);
}
}
return sum;
}
作者:windliang
链接:https://leetcode-cn.com/problems/trapping-rain-water/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by-w-8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

- 解法四:还有一种栈的方法,我觉得这种想法跟我的想法比较类似,只不过我只记录了一个位置,而栈可以记录多个位置,逐一求得面积。但是网上的解法报错了,就不粘了。