mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
Update 0042.接雨水.md
增加Java 单调栈实现
This commit is contained in:
@ -391,6 +391,7 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
动态规划法
|
||||
```java
|
||||
class Solution {
|
||||
@ -418,6 +419,52 @@ class Solution {
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
单调栈法
|
||||
```java
|
||||
public int trapMonoStack(int[] height){
|
||||
int size = height.length;
|
||||
|
||||
if (size <= 2) return 0;
|
||||
|
||||
// in the stack, we push the index of array
|
||||
// using height[] to access the real height
|
||||
Stack<Integer> stack = new Stack<Integer>();
|
||||
stack.push(0);
|
||||
|
||||
int sum = 0;
|
||||
for (int index = 1; index < size; index++){
|
||||
int stackTop = stack.peek();
|
||||
if (height[index] < height[stackTop]){
|
||||
stack.push(index);
|
||||
}else if (height[index] == height[stackTop]){
|
||||
// 因为相等的相邻墙,左边一个是不可能存放雨水的,所以pop左边的index, push当前的index
|
||||
stack.pop();
|
||||
stack.push(index);
|
||||
}else{
|
||||
//pop up all lower value
|
||||
int heightAtIdx = height[index];
|
||||
while (!stack.isEmpty() && (heightAtIdx > height[stackTop])){
|
||||
int mid = stack.pop();
|
||||
|
||||
if (!stack.isEmpty()){
|
||||
int left = stack.peek();
|
||||
|
||||
int h = Math.min(height[left], height[index]) - height[mid];
|
||||
int w = index - left - 1;
|
||||
int hold = h * w;
|
||||
if (hold > 0) sum += hold;
|
||||
stackTop = stack.peek();
|
||||
}
|
||||
}
|
||||
stack.push(index);
|
||||
}
|
||||
}
|
||||
|
||||
return sum;
|
||||
}
|
||||
```
|
||||
|
||||
Python:
|
||||
|
||||
双指针法
|
||||
|
Reference in New Issue
Block a user