-
代码:
class Solution: def uniquePaths(self, m: int, n: int) -> int: f = [[1] * n] + [[1] + [0] * (n - 1) for _ in range(m - 1)] #注意,这里[1] * n是先创建了一个全是1的1*n维的行矩阵,然后在让其加上两个开头为1 的(m-1)* n 维的矩阵。 #print(f) for i in range(1, m): for j in range(1, n): f[i][j] = f[i - 1][j] + f[i][j - 1] return f[m - 1][n - 1] m, n = 3, 7 a = Solution() print(a.uniquePaths(m, n))
思路:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H31NBFYq-1611046494447)(/home/lx/.config/Typora/typora-user-images/image-20210119160455339.png)]
因为出发点是在左上角,终点在右下角,所以每一格的状态只与其左边和上方这两格的状态有关,所以动态方程是dp[i][j] = dp[i][j-1] + dp[i-1][j]
,如果出发点不同的话,动态转移方程也会不同。
-
优化后:
class Solution: def uniquePaths(self, m: int, n: int) -> int: cur = [1] * n for i in range(1, m): for j in range(1, n): cur[j] += cur[j-1] return cur[-1] m, n = 3, 7 a = Solution() print(a.uniquePaths(m, n))
利用遍历的同时累加列的方式,大大缩小了空间复杂度,将空间复杂度降低到O(n),大力称赞这种做法,剪枝太神奇了。
class Solution:
def climbStairs(self, n: int) -> int:
if n==1 or n==2: return n
a, b, temp = 1, 2, 0
for i in range(3,n+1):
temp = a + b
a = b
b = temp
return temp
依旧是动态规划,不多说了,思路和官方的一样,很简单
代码:
res = [[]]
for i in nums:
res = res + [[i] + num for num in res]
return res
思路:利用迭代方法,目前还在看其他的思路,还不是太理解别人的,我再下去理解理解。