package top100liked import ( "fmt" "testing" ) // https://leetcode.cn/problems/largest-rectangle-in-histogram/?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) // } // } // return maxArea // } 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})) }