2020/05/08 每日一题
221 最大正方形面积
是一道做过的题目出现在了每日一题,今后的每日一题我尽量把相关的题目都写一遍。
这道题目的思路并不是看到01矩阵就采用暴力的bfs方法,而是可以采用dp的思想。因为正方形具有不错的性质可以采用保存边长的方法,最后计算面积。
- 核心dp:
dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j])+1
。寻找三个位置的最小值。
class Solution:
def maximalSquare(self, matrix: List[List[str]]) -> int:
n = len(matrix)
if not n:
return 0
m = len(matrix[0])
dp = [[0]*(m+1) for _ in range(n+1)]
ans = 0
for i in range(1, n+1):
for j in range(1, m+1):
if matrix[i-1][j-1] == '1':
dp[i][j] = min(dp[i-1][j-1], dp[i][j-1], dp[i-1][j])+1
ans = max(dp[i][j], ans)
return ans*ans
85 最大矩形面积
将问题从正方形变成最大矩形,问题就复杂了一下。
正方形的设计很固定的,我们上一个问题中,给定一个点,计算左上方的大小。但是对于长方形,即使你知道这个点是长方形的右下角,但是也无法确定长方形是躺下还是立起来的。
因此这里采用一种全新的dp思路。给定一个点(i,j)
我们首先向上伸展得到最大的高度,然后分别计算出左右伸展可以达到的坐标。这样可以计算以该点伸展开的长方形的大小。
核心在于如何维护左右伸展,我们需要保证在同一列中连续出现1时维护一个最紧的边界。
具体我在代码中进行了注释,这段代码其实用到了状态压缩。
class Solution {
public int maximalRectangle(char[][] ma