!! 记住,确定 dp数组的下标含义
写在前头的感悟
其实,很多时候随便开始就好了,不用尽心策划后再动手。
最初刷算法我是精心策划时间,每天刷几道题,哪个时间段集中用来刷题。However, 没坚持几天就被科研任务占满时间。科研之外有空,我也不想去刷题,好挫败,想逃避。现在我就不管了,跟着carl的算法训练营,每天给我布置好任务。尽量挤时间去刷,不再去管自己的情绪。
还有一个,就是问题出现了,直奔解决问题方法,忽略期间的情绪。 问题出现的时候,总会伴随着情绪的起伏。讨厌,生气,无语。当你还沉浸在这些情绪的时候,别人已经解决完问题了。时间很宝贵的!
Task
● 62.不同路径
● 63. 不同路径 II
今天开始逐渐有 dp的感觉了,题目不多,就两个 不同路径,可以好好研究一下
详细布置
62.不同路径
本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。
programmercarl.com/0062.%E4%B8…
视频讲解:www.bilibili.com/video/BV1ve…
63. 不同路径 II
programmercarl.com/0063.%E4%B8…
视频讲解:www.bilibili.com/video/BV1Ld…
62.不同路径
创建m x n 二维链表
dp = [[0] * n for _ in range(m)]
二维DP数组遍历
63. 不同路径 II
有障碍初始化
carl版
dp = [[0] * n for _ in range(m)]
for i in range(m):
if obstacleGrid[i][0] == 0: # 遇到障碍物时,直接退出循环,后面默认都是0
dp[i][0] = 1
else:
break
for j in range(n):
if obstacleGrid[0][j] == 0:
dp[0][j] = 1
else:
break
我版:太冗余
dp = [[0] * n for _ in range(m)]
flag = False
for i in range(n):
if obstacleGrid[0][i] == 1: # 遇到障碍物时,直接退出循环,后面默认都是0
flag = True
if flag == False:
dp[0][i] = 1
else:
dp[0][i] = 0
flag = False
for i in range(m):
if obstacleGrid[i][0] == 1:
flag = True
if flag == False:
dp[i][0] = 1
else:
dp[i][0] = 0
开始的时候特殊值处理:障碍图的起始和终点都有障碍(我忽略了,但leetcode还是可以AC)
if obstacleGrid[m - 1][n - 1] == 1 or obstacleGrid[0][0] == 1:
return 0