LeetCode #62 Unique Paths
题目
解题方法
从最基础的1×1开始找规律,此时起点就是终点,到达终点的独特的路径数为1,写在方格内。
|1|
变化一下,2×2,此时从起点走到它右边的格子有1种走法,走到下面的格子有1种走法,而走到终点的走法有1+1=2种,写在方格内。
|1| |1|
|1| |2|
再变化一下,3×7,此时从起点走到它右边所有格子都只有1种走法,走到下面所有格子也是1种走法,先写在方格内。
|1| |1| |1| |1| |1| |1| |1|
|1| | | | | | | | | | | | |
|1| | | | | | | | | | | | |
如果此时把matrix[1][1]视为终点,就是2×2的情形,可以在对应的格子中写出走法数,把matrix[2][2]视为终点,就是3×3的情形,以此类推...可得如下矩阵:
|1| |1| |1| |1| |1| |1| |1|
|1| |2| |3| |4| |5| |6| |7|
|1| |3| |6| |10| |15| |21| |28|
不难看出每个格子中的数字就是从左上角走到这个格子的unique path数。
那么在编程时,我们可以用动态规划的思想,一边构造这个数组,一边计算每个格子的unique path数,首先初始化matrix=[[1]],然后把第一行构造出来。之后遍历m和n,都是先单独处理matrix[m][0],然后把后面的内容计算出来填进去即可,最后返回matrix[-1][-1]。
代码
class Solution:
def uniquePaths(self, m: int, n: int) -> int:
matrix = [[1]]
for i in range(n-1):
matrix[0].append(1)
for i in range(1, m):
for j in range(n):
if not j:
matrix.append([1])
else:
matrix[i].append(matrix[i-1][j] + matrix[i][j-1])
return matrix[-1][-1]