LeetCode 221.最大正方形 解法

10 篇文章 1 订阅
/**
LeetCode 221.最大正方形
形成2*2的小正方形,基础上
[
	[a, b]
	[c, d(?)]
]
若b >= a && c >= a说明d所在的一个正方形可以在a的基础上,扩充一行一列,变为长宽为a+1的正方形
否则d为Min(b, c)的最小值为长宽的正方形,增加一行一列,变为长宽为Min(b, a)+1的正方形
 */
func maximalSquare(matrix [][]byte) int {
	rowLen := len(matrix)
	ans := 0
	if rowLen == 0 {
		return ans
	}
	dp := make([][500]int, rowLen+1)
	for i:=0; i<rowLen; i++ {
		colLen := len(matrix[i])
		for j:=0; j<colLen; j++ {
			if matrix[i][j] == '1' {
				//初始化
				dp[i][j] = 1
				//是否可以形成2*2的小正方形
				if j-1  >= 0 && i-1 >= 0 &&  matrix[i][j-1] == '1' && matrix[i-1][j-1] == '1'  && matrix[i-1][j] == '1' {
					/**
					[
						[a, b]
						[c, d(?)]
					]
					若b >= a && c >= a说明d所在的一个正方形可以在a的基础上,扩充一行一列,变为长宽为a+1的正方形
					否则d为Min(b, c)的最小值为长宽的正方形,增加一行一列,变为长宽为Min(b, a)+1的正方形
					 */
					if dp[i-1][j-1] <= dp[i][j-1] && dp[i-1][j-1] <= dp[i-1][j]{
						dp[i][j] = dp[i-1][j-1] + 1
					} else {
						dp[i][j] = Min(dp[i][j-1], dp[i-1][j]) + 1
					}
				}
				ans = Max(ans, dp[i][j] * dp[i][j])
			}
		}
	}

	return ans
}

func Max(i, j int) int {
	if i > j {
		return i
	}
	return j
}

func Min(i, j int) int {
	if i > j {
		return j
	}
	return i
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值