六十六--67 单调栈

这篇博客探讨了如何利用单调栈解决两个编程问题:1.找到一维数组中最大矩形的面积;2.在二维矩阵中找到最大的矩形区域。通过分析代码,可以看到单调栈在处理这类问题时如何找到符合条件的最大矩形,从而求得最大面积。算法适用于数组和矩阵中寻找连续元素构成的最大矩形区域。
摘要由CSDN通过智能技术生成

66 直方图最大矩形面具

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/0ynMMM/

//采用单调栈的思路,栈内数字必须单调递增
func largestRectangleArea(heights []int) int {
    var res int
	stack:=[]int{}
    //用于解决边界问题,当只有一个长度的heights传入,不用做特殊处理
	heights = append(heights,0)
    //-1的目的是可以将栈内遗留的值全部排出
	heights = append([]int{-1}, heights...)
	for i:=0;i<len(heights);i++{
		//当栈内有多于1个且当前值小于栈内末尾值需要被排出
		for len(stack)>1&&heights[i]<heights[stack[len(stack)-1]]{
            //由于遇到了i为比len(stack)-1小,需要排出len(stack)-1为index1
            //找到其次小len(stack)-2为index2
            //由于单调性则index2-index1-1这个长度都满足高度heights[stack[len(stack)-1]]
            //求最大即可,之后删除栈末尾值
			lastindex:=stack[len(stack)-2]
			height:=heights[stack[len(stack)-1]]
			res = max(res,height*(i-lastindex-1))
			stack = stack[:len(stack)-1]
		}
		stack = append(stack,i)
	}
	return res
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

67 矩阵中最大的矩形

力扣icon-default.png?t=LA92https://leetcode-cn.com/problems/PLYXKQ/

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func getMaxArea(arr []int)int{
	var res int
	stack:=[]int{}
	arr = append(arr,0)
	arr = append([]int{-1}, arr...)
	for i:=0;i<len(arr);i++{
		//单调增
		for len(stack)>1&&arr[i]<arr[stack[len(stack)-1]]{
			lastindex:=stack[len(stack)-2]
			height:=arr[stack[len(stack)-1]]
			res = max(res,height*(i-lastindex-1))
			stack = stack[:len(stack)-1]
		}
		stack = append(stack,i)
	}
	return res
}

func maximalRectangle(matrix []string) int {
    if len(matrix)==0{
        return 0
    }
	var max int
	arr :=make([]int,len(matrix[0]))
	for i:=0;i<len(matrix);i++{
		for j:=0;j<len(matrix[i]);j++{
			tmp,_:=strconv.Atoi(string(matrix[i][j]))
			if tmp == 0{
				arr[j] = 0
			}else{
				arr[j] = arr[j] + tmp
			}
		}
		//一个矩形
		tmp := getMaxArea(arr)
		if tmp > max{
			max = tmp
		}
	}
	return max
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值