题目:
一行一行的算所接雨水量
代码:
class Solution {
public int trap(int[] height) {
int res=0;
int temp=0;
int max=0;
int flag=0;
//找到最高的值
for(int i=0;i<height.length;i++){
if(height[i]>max)
max=height[i];
}
//分层进行计算
for(int i=1;i<=max;i++){
flag=0;
temp=0;
for(int j=0;j<height.length;j++){
//找到第一个大于所求层数的值,进行标注
if(flag==0 && height[j]>=i){
flag=1;
continue;
}
//只有标注过后才可以temp++
if(flag==1 && height[j]<i){
temp++;
continue;
}
//当再次遇到超过目标层数的值后,可以再res中加上temp
if(flag==1 && height[j]>=i){
res+=temp;
temp=0;
}
}
}
return res;
}
}
时间复杂度是O(n*max)
可能是这个办法有点取巧了,在leetcode中是会超时的
这时候我们就需要更有效的方法
我尝试了按列求所接雨水
代码:
class Solution {
public int trap(int[] height) {
int res=0;
int left_max=0;
int right_max=0;
for(int i=1;i<height.length-1;i++){
left_max=0;
right_max=0;
//找出当前列左侧的最高峰
for(int j=0;j<i;j++){
if(height[j]>left_max)
left_max=height[j];
}
//找出当前列右侧的最高峰
for(int j=i+1;j<height.length;j++){
if(height[j]>right_max)
right_max=height[j];
}
//只有两边的最大值都比当前列的值大时,才能进行加法操作
if(height[i]<Math.min(left_max,right_max))
res=res+Math.min(left_max,right_max)-height[i];
}
return res;
}
}
时间复杂度O(n^2)