/*
解法一:按行求
一層一層的遍歷,先遍歷第一層,再第二層,,,
*/public
inttrap
(int
height)
if(height[j]
>= i)}}
return sum;
}private
intgetmax
(int
height)
}return max;
}
/*
方法二:按列求
*/public
inttrap
(int
height)
}int max_right =0;
//找出右邊最高
for(
int j = i +
1; j < height.length; j++)}
//找出兩端較小的
int min = math.
min(max_left, max_right)
;//只有較小的一段大於當前列的高度才會有水,其他情況不會有水
if(min > height[i])}
return sum;
}
/*
方法三:動態規劃
*/public
inttrap
(int
height)
for(
int i = height.length -
2; i >=
0; i--
)for
(int i =
1; i < height.length -
1; i++)}
return sum;
}
/*
方法四:三指標
*/public
inttrap
(int
height)
}//統計最高柱子左邊能接的雨水數量
int left = height[0]
;int right =0;
int water =0;
for(
int i =
1; i < maxindex; i++
)else
}//統計最高柱子右邊能接的雨水數量
right = height[height.length -1]
;for
(int i = height.length -
2; i > maxindex; i--
)else
}//返回盛水量
return water;
}//雙指標
public
inttrap
(int
height)
else
}return water;
}
/*
方法五:棧
*/public
inttrap6
(int
height)
int distance = current - stack.
peek()
-1;//兩堵牆之前的距離。
int min = math.
min(height[stack.
peek()
], height[current]);
sum = sum + distance *
(min - h);}
stack.
push
(current)
;//當前指向的牆入棧
current++
;//指標後移
}return sum;
}public
inttrap
(int
a)else
}return maxwater;
}
/*
方法六:數學法
*/public
inttrap
(int
height)
fangge = math.
max(maxleft, maxright)
* height.length;
return
(s1 + s2)
- fangge - zhuzi;
}
/*
*/public
inttrap
(int
a)else
}return max;
}
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...
42 接雨水 雙指標
對於乙個較低的坑來說,其儲水量高度取決於左側最高柱與右側最高柱的較小高度 可以用兩個指標,分別從左右兩邊往中間逼近,左側或者右側的儲水量只取決於當前一側的高度差 if len height 0 return 0left,right 0,len height 1 left max,right max ...
單調棧 42 接雨水
給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖,計算按此排列的柱子,下雨之後能接多少雨水。上面是由陣列 0,1,0,2,1,0,1,3,2,1,2,1 表示的高度圖,在這種情況下,可以接 6 個單位的雨水 藍色部分表示雨水 感謝 marcos 貢獻此圖。示例 輸入 0,1,0,2,1,0,1...