This commit is contained in:
2026-07-23 16:56:50 +08:00
parent 124ad9afdf
commit 92784ffb0f
36 changed files with 2015 additions and 608 deletions
+48 -46
View File
@@ -5,56 +5,58 @@ import (
"testing"
)
// https://leetcode.cn/problems/largest-rectangle-in-histogram/?envType=study-plan-v2&envId=top-100-liked
// https://leetcode.cn/problems/daily-temperatures/?envType=study-plan-v2&envId=top-100-liked
// 暴力法,超时
// func largestRectangleArea(heights []int) int {
// maxArea := 0
// // i 是每个组合中的元素数量
// for i := 1; i <= len(heights); i++ {
// // j 是在整个 heights 中滑动的次数
// for j := 0; j < len(heights)-i+1; j++ {
// // 计算
// maxArea = max(maxArea, slices.Min(heights[j:j+i])*i)
func dailyTemperatures(temperatures []int) []int {
res := make([]int, len(temperatures))
stack := make([]int, 0, len(temperatures))
for i := len(temperatures) - 1; i >= 0; i-- {
for len(stack) > 0 && temperatures[stack[len(stack)-1]] <= temperatures[i] {
stack = stack[:len(stack)-1]
}
if len(stack) > 0 {
res[i] = stack[len(stack)-1] - i
}
stack = append(stack, i)
}
return res
}
// func dailyTemperatures(temperatures []int) []int {
// type item struct {
// Idx int
// Temp int
// }
// stack := []item{}
// res := make([]int, len(temperatures))
// for i := len(temperatures) - 1; i >= 0; i-- {
// cur := temperatures[i]
// if len(stack) == 0 {
// stack = append(stack, item{i, cur})
// res[i] = 0
// } else {
// for {
// if len(stack) == 0 {
// stack = append(stack, item{i, cur})
// res[i] = 0
// break
// }
// top := stack[len(stack)-1]
// if cur < top.Temp {
// res[i] = top.Idx - i
// stack = append(stack, item{i, cur})
// break
// } else {
// stack = stack[:len(stack)-1] // pop
// }
// }
// }
// }
// return maxArea
// return res
// }
func largestRectangleArea(heights []int) int {
stack := []int{}
maxArea := 0
for i := range len(heights) + 1 {
if len(stack) == 0 {
stack = append(stack, i)
continue
}
var cur int
if i == len(heights) {
cur = 0
} else {
cur = heights[i]
}
if cur >= heights[stack[len(stack)-1]] {
stack = append(stack, i)
} else {
for len(stack) > 0 && heights[stack[len(stack)-1]] > cur {
top := stack[len(stack)-1]
stack = stack[:len(stack)-1]
width := i
if len(stack) > 0 {
width = i - stack[len(stack)-1] - 1
}
maxArea = max(maxArea, heights[top]*width)
}
stack = append(stack, i)
}
}
return maxArea
}
func Test(t *testing.T) {
fmt.Println(largestRectangleArea([]int{2, 1, 5, 6, 2, 3}))
fmt.Println(largestRectangleArea([]int{1}))
fmt.Println(largestRectangleArea([]int{2, 1, 2}))
fmt.Printf("%+v", dailyTemperatures([]int{73, 74, 75, 71, 69, 72, 76, 73}))
}