64. 最小路径和
1、这题也是二维矩阵的,思路和昨天的差不多。
2、代码如下
class Solution:
def minPathSum(self, grid: List[List[int]]) -> int:
m = len(grid)
n = len(grid[0])
# 讨论m=1 or n=1
if m==1:
return sum(grid[0])
if n==1:
sum_n = 0
for i in grid:
sum_n +=i[0]
return sum_n
#初始化左列和上列
old_row = [0]*(n)
left = [0]*(m)
new_row = [0]*n
old_row[0]= grid[0][0]
left[0] = grid[0][0]
for i in range(1,n):
old_row[i] = old_row[i-1]+grid[0][i]
for j in range(1,m):
left[j] = left[j-1] + grid[j][0]
#逐行逐步递归
for i in range(1,m):
left_val = left[i]
for j in range(1,n):
new_row[j]=min(old_row[j],left_val)+grid[i][j]
left_val = new_row[j]
old_row = new_row[:]
return new_row[-1]
3、效果还不错
221. 最大正方形
1、这题一眼看过去,没有什么思路
2、看了答案,大概懂了,这种递归的思想还要加强——以某单元格为正方形的右下角,记录最大的正方形长度。
3、补一行和一列的思想之前做过,为了处理原始数据的第一行和第一列。
4、这里要注意,他的字段类型是str,判断的时候不要当成int
5、如果本身不为1,那么以这个单元格为右下角的正方形大小就为0
6、我这里一直在算的是最长边的大小,最后要求面积,所以需要平方一下
class Solution:
def maximalSquare(self, matrix: List[List[str]]) -> int:
m = len(matrix)
n = len(matrix[0])
if m==1:
if '1' in matrix[0]:
return 1
else:
return 0
if n==1:
for i in matrix:
if '1' in i:
return 1
return 0
dp = [[0]*(n+1) for i in range(m+1)]
for i in range(1,m+1):
for j in range(1,n+1):
if matrix[i-1][j-1]=='1':
dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1
else:
dp[i][j]=0
max_val = 0
for i in range(m+1):
max_row = max(dp[i])
if max_row>max_val:
max_val = max_row
return max_val*max_val