From aa8912611f5ef47e5b46f2a3d7991c697fb50f7e Mon Sep 17 00:00:00 2001 From: novahe Date: Thu, 10 Jun 2021 23:52:39 +0800 Subject: [PATCH] fix/84: clean up redundant code --- .../84. Largest Rectangle in Histogram.go | 41 +++++++--------- ...84. Largest Rectangle in Histogram_test.go | 4 ++ .../0084.Largest-Rectangle-in-Histogram.md | 49 ++++++++++--------- 3 files changed, 46 insertions(+), 48 deletions(-) diff --git a/leetcode/0084.Largest-Rectangle-in-Histogram/84. Largest Rectangle in Histogram.go b/leetcode/0084.Largest-Rectangle-in-Histogram/84. Largest Rectangle in Histogram.go index 6b782978..d01401b0 100644 --- a/leetcode/0084.Largest-Rectangle-in-Histogram/84. Largest Rectangle in Histogram.go +++ b/leetcode/0084.Largest-Rectangle-in-Histogram/84. Largest Rectangle in Histogram.go @@ -1,32 +1,25 @@ package leetcode -import "fmt" - func largestRectangleArea(heights []int) int { - maxArea, stack, height := 0, []int{}, 0 - for i := 0; i <= len(heights); i++ { - if i == len(heights) { - height = 0 - } else { - height = heights[i] + maxArea := 0 + n := len(heights) + 2 + // Add a sentry at the beginning and the end + getHeight := func(i int) int { + if i == 0 || n-1 == i { + return 0 } - if len(stack) == 0 || height >= heights[stack[len(stack)-1]] { - stack = append(stack, i) - } else { - tmp := stack[len(stack)-1] - fmt.Printf("1. tmp = %v stack = %v\n", tmp, stack) - stack = stack[:len(stack)-1] - length := 0 - if len(stack) == 0 { - length = i - } else { - length = i - 1 - stack[len(stack)-1] - fmt.Printf("2. length = %v stack = %v i = %v\n", length, stack, i) - } - maxArea = max(maxArea, heights[tmp]*length) - fmt.Printf("3. maxArea = %v heights[tmp]*length = %v\n", maxArea, heights[tmp]*length) - i-- + return heights[i-1] + } + st := make([]int, 0, n/2) + for i := 0; i < n; i++ { + for len(st) > 0 && getHeight(st[len(st)-1]) > getHeight(i) { + // pop stack + idx := st[len(st)-1] + st = st[:len(st)-1] + maxArea = max(maxArea, getHeight(idx)*(i-st[len(st)-1]-1)) } + // push stack + st = append(st, i) } return maxArea } diff --git a/leetcode/0084.Largest-Rectangle-in-Histogram/84. Largest Rectangle in Histogram_test.go b/leetcode/0084.Largest-Rectangle-in-Histogram/84. Largest Rectangle in Histogram_test.go index 7226916a..0465a1eb 100644 --- a/leetcode/0084.Largest-Rectangle-in-Histogram/84. Largest Rectangle in Histogram_test.go +++ b/leetcode/0084.Largest-Rectangle-in-Histogram/84. Largest Rectangle in Histogram_test.go @@ -40,6 +40,10 @@ func Test_Problem84(t *testing.T) { para84{[]int{1, 1}}, ans84{2}, }, + { + para84{[]int{2, 1, 2}}, + ans84{3}, + }, } fmt.Printf("------------------------Leetcode Problem 84------------------------\n") diff --git a/website/content/ChapterFour/0001~0099/0084.Largest-Rectangle-in-Histogram.md b/website/content/ChapterFour/0001~0099/0084.Largest-Rectangle-in-Histogram.md index 5937127d..c2c9e289 100644 --- a/website/content/ChapterFour/0001~0099/0084.Largest-Rectangle-in-Histogram.md +++ b/website/content/ChapterFour/0001~0099/0084.Largest-Rectangle-in-Histogram.md @@ -41,37 +41,38 @@ Output: 10 package leetcode -import "fmt" - func largestRectangleArea(heights []int) int { - maxArea, stack, height := 0, []int{}, 0 - for i := 0; i <= len(heights); i++ { - if i == len(heights) { - height = 0 - } else { - height = heights[i] + maxArea := 0 + n := len(heights) + 2 + // Add a sentry at the beginning and the end + getHeight := func(i int) int { + if i == 0 || n-1 == i { + return 0 } - if len(stack) == 0 || height >= heights[stack[len(stack)-1]] { - stack = append(stack, i) - } else { - tmp := stack[len(stack)-1] - fmt.Printf("1. tmp = %v stack = %v\n", tmp, stack) - stack = stack[:len(stack)-1] - length := 0 - if len(stack) == 0 { - length = i - } else { - length = i - 1 - stack[len(stack)-1] - fmt.Printf("2. length = %v stack = %v i = %v\n", length, stack, i) - } - maxArea = max(maxArea, heights[tmp]*length) - fmt.Printf("3. maxArea = %v heights[tmp]*length = %v\n", maxArea, heights[tmp]*length) - i-- + return heights[i-1] + } + st := make([]int, 0, n/2) + for i := 0; i < n; i++ { + for len(st) > 0 && getHeight(st[len(st)-1]) > getHeight(i) { + // pop stack + idx := st[len(st)-1] + st = st[:len(st)-1] + maxArea = max(maxArea, getHeight(idx)*(i-st[len(st)-1]-1)) } + // push stack + st = append(st, i) } return maxArea } +func max(a int, b int) int { + if a > b { + return a + } + return b +} + + ```