mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
Merge pull request #2280 from ShuangmingMa/master
修改 0503.下一个更大元素II go版本中的代码,添加 0042.接雨水 Go版本的单调栈压缩版解法,修改 0084.柱状图中最大的矩形 Go单调栈代码的格式
This commit is contained in:
@ -704,6 +704,45 @@ func min(x, y int) int {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
单调栈压缩版:
|
||||||
|
|
||||||
|
```go
|
||||||
|
func trap(height []int) int {
|
||||||
|
stack := make([]int, 0)
|
||||||
|
res := 0
|
||||||
|
|
||||||
|
// 无需事先将第一个柱子的坐标入栈,因为它会在该for循环的最后入栈
|
||||||
|
for i := 0; i < len(height); i ++ {
|
||||||
|
// 满足栈不为空并且当前柱子高度大于栈顶对应的柱子高度的情况时
|
||||||
|
for len(stack) > 0 && height[stack[len(stack) - 1]] < height[i] {
|
||||||
|
// 获得凹槽高度
|
||||||
|
mid := height[stack[len(stack) - 1]]
|
||||||
|
// 凹槽坐标出栈
|
||||||
|
stack = stack[: len(stack) - 1]
|
||||||
|
|
||||||
|
// 如果栈不为空则此时栈顶元素为左侧柱子坐标
|
||||||
|
if len(stack) > 0 {
|
||||||
|
// 求得雨水高度
|
||||||
|
h := min(height[i], height[stack[len(stack) - 1]]) - mid
|
||||||
|
// 求得雨水宽度
|
||||||
|
w := i - stack[len(stack) - 1] - 1
|
||||||
|
res += h * w
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 如果栈为空或者当前柱子高度小于等于栈顶对应的柱子高度时入栈
|
||||||
|
stack = append(stack, i)
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func min(x, y int) int {
|
||||||
|
if x < y {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
return y
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
### JavaScript:
|
### JavaScript:
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
|
@ -478,36 +478,34 @@ class Solution:
|
|||||||
|
|
||||||
```go
|
```go
|
||||||
func largestRectangleArea(heights []int) int {
|
func largestRectangleArea(heights []int) int {
|
||||||
// 声明max并初始化为0
|
max := 0
|
||||||
max := 0
|
// 使用切片实现栈
|
||||||
// 使用切片实现栈
|
stack := make([]int, 0)
|
||||||
stack := make([]int, 0)
|
// 数组头部加入0
|
||||||
// 数组头部加入0
|
heights = append([]int{0}, heights...)
|
||||||
heights = append([]int{0}, heights...)
|
// 数组尾部加入0
|
||||||
// 数组尾部加入0
|
heights = append(heights, 0)
|
||||||
heights = append(heights, 0)
|
// 初始化栈,序号从0开始
|
||||||
// 初始化栈,序号从0开始
|
stack = append(stack, 0)
|
||||||
stack = append(stack, 0)
|
for i := 1; i < len(heights); i ++ {
|
||||||
for i := 1; i < len(heights); i++ {
|
// 结束循环条件为:当即将入栈元素>top元素,也就是形成非单调递增的趋势
|
||||||
// 结束循环条件为:当即将入栈元素>top元素,也就是形成非单调递增的趋势
|
for heights[stack[len(stack) - 1]] > heights[i] {
|
||||||
for heights[stack[len(stack)-1]] > heights[i] {
|
// mid 是top
|
||||||
// mid 是top
|
mid := stack[len(stack) - 1]
|
||||||
mid := stack[len(stack)-1]
|
// 出栈
|
||||||
// 出栈
|
stack = stack[0 : len(stack) - 1]
|
||||||
stack = stack[0 : len(stack)-1]
|
// left是top的下一位元素,i是将要入栈的元素
|
||||||
// left是top的下一位元素,i是将要入栈的元素
|
left := stack[len(stack) - 1]
|
||||||
left := stack[len(stack)-1]
|
// 高度x宽度
|
||||||
// 高度x宽度
|
tmp := heights[mid] * (i - left - 1)
|
||||||
tmp := heights[mid] * (i - left - 1)
|
if tmp > max {
|
||||||
if tmp > max {
|
max = tmp
|
||||||
max = tmp
|
}
|
||||||
}
|
}
|
||||||
}
|
stack = append(stack, i)
|
||||||
stack = append(stack, i)
|
}
|
||||||
}
|
return max
|
||||||
return max
|
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### JavaScript:
|
### JavaScript:
|
||||||
|
@ -207,7 +207,7 @@ class Solution:
|
|||||||
```go
|
```go
|
||||||
func nextGreaterElements(nums []int) []int {
|
func nextGreaterElements(nums []int) []int {
|
||||||
length := len(nums)
|
length := len(nums)
|
||||||
result := make([]int,length,length)
|
result := make([]int,length)
|
||||||
for i:=0;i<len(result);i++{
|
for i:=0;i<len(result);i++{
|
||||||
result[i] = -1
|
result[i] = -1
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user