一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?
例如,上图是一个7 x 3 的网格。有多少可能的路径?
说明:m 和 n 的值均不超过 100。
示例 1:
输入: m = 3, n = 2 输出: 3 解释: 从左上角开始,总共有 3 条路径可以到达右下角。 1. 向右 -> 向右 -> 向下 2. 向右 -> 向下 -> 向右 3. 向下 -> 向右 -> 向右
示例 2:
输入: m = 7, n = 3 输出: 28
递归比较简单,但是超时。。。,先放递归的做法
func uniquePaths(m int, n int) int {
record := make([][]int, m+1)
for i := 0; i < m+1; i++ {
record[i] = make([]int, n+1)
}
return up(m, n, record)
}
func up(m, n int, record [][]int) int {
if m == 1 && n == 1 {
return 1
}
if record[m][n] > 0 {
return record[m][n]
}
ret := 0
if m > 1 {
ret += uniquePaths(m - 1, n)
}
if n > 1 {
ret += uniquePaths(m, n - 1)
}
record[m][n] = ret
return ret
}
看看递归,发现record直接可以递推,record[i][j] = record[i-1][j] + record[i][j-1]
所以循环就完事了
func uniquePaths(m int, n int) int {
record := make([][]int, m)
for i := 0; i < m; i++ {
record[i] = make([]int, n)
}
record[0][0] = 1
i := 0
j := 0
for i < m {
j = 0
for j < n {
if i > 0 {
record[i][j] += record[i-1][j]
}
if j > 0 {
record[i][j] += record[i][j-1]
}
j++
}
i++
}
return record[m-1][n-1]
}