Merge pull request #2280 from ShuangmingMa/master

修改 0503.下一个更大元素II go版本中的代码,添加 0042.接雨水 Go版本的单调栈压缩版解法,修改 0084.柱状图中最大的矩形 Go单调栈代码的格式
This commit is contained in:
程序员Carl
2023-09-27 15:24:38 +08:00
committed by GitHub
3 changed files with 67 additions and 30 deletions

View File

@ -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

View File

@ -478,7 +478,6 @@ 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)
@ -488,15 +487,15 @@ func largestRectangleArea(heights []int) int {
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 {
@ -507,7 +506,6 @@ func largestRectangleArea(heights []int) int {
} }
return max return max
} }
``` ```
### JavaScript: ### JavaScript:

View File

@ -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
} }