柱状图最大矩形——单调栈巧解

题目leetcode:. - 力扣(LeetCode)

之前发的接雨水是在矩形外部,而这次是在内部,这次动态规划不便了,更方便的是单调栈。为什么?思路是什么?抓住核心要害,你这个柱子容量最大也得是有个最低的柱子,我们就按以每个柱子为最低点算,看能最多能装多少水,最后选个最大的,那这就要找左右第一个比其矮的柱子了,这就是典型的单调栈问题了吧,上代码:

package main

import "container/list"

// 改用单调栈,装水最多,必然需要以其中一个作为底座,找到左边第一个比其小的,右边第一个比其小的
func largestRectangleArea(heights []int) int {
	leftStack := list.New()
	rightStack := list.New()
	n := len(heights)
	leftArr := make([]int, n)
	rightArr := make([]int, n)
	for i := 0; i < n; i++ {
		leftArr[i] = -1
	}
	for i := 0; i < n; i++ {
		rightArr[i] = n
	}

	// 右边第一个比其小的
	for i := 0; i < n; i++ {
		if rightStack.Len() == 0 {
			rightStack.PushFront(i)
		} else {
			for rightStack.Len() != 0 && heights[i] < heights[rightStack.Front().Value.(int)] {
				ele := rightStack.Front()
				rightStack.Remove(ele)
				rightArr[ele.Value.(int)] = i
			}
			rightStack.PushFront(i)
		}
	}

	// 左边第一个比其小的
	for i := n - 1; i >= 0; i-- {
		if leftStack.Len() == 0 {
			leftStack.PushFront(i)
		} else {
			for leftStack.Len() != 0 && heights[i] < heights[leftStack.Front().Value.(int)] {
				ele := leftStack.Front()
				leftStack.Remove(ele)
				leftArr[ele.Value.(int)] = i
			}
			leftStack.PushFront(i)
		}
	}

	max := 0
	for i := 0; i < n; i++ {
		leftflg := leftArr[i]
		rightflg := rightArr[i]
		// leftflg+1 ~ rightflg-1
		if (rightflg-leftflg-1)*heights[i] > max {
			max = (rightflg - leftflg - 1) * heights[i]
		}
	}

	return max
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值