62. Unique Paths
基础的动规。
方法一:
1.第一行,第一列初始化为1
2.board[i][j] = borad[i-1][j] + board[i][j-1];
3.返回board[row-1][col-1]
1 if(m <= 0 || n <= 0) { 2 return 0; 3 } 4 int[][] board = new int[m][n]; 5 for(int i = 0; i < m; i++) { 6 board[i][0] = 1; 7 } 8 for(int i = 0; i < n; i++) { 9 board[0][i] = 1; 10 } 11 for(int i = 1; i < m; i++) { 12 for(int j = 1; j < n; j++) { 13 board[i][j] = board[i-1][j] + board[i][j-1]; 14 } 15 } 16 return board[m-1][n-1]; 17 }
这种是我自己写的,因为alan上课比较习惯这样写,但是看了code ganker的解答,人家的大概漂亮一百倍吧
下面都是他的方法:
方法二:
不是很好的方法,时间比较超,但是是好看的递归。
1 public int uniquePaths(int m, int n) { 2 if(m <= 0 || n <= 0) { 3 return 0; 4 } 5 return helper(1,1,m,n); 6 } 7 8 private int helper(int row, int col, int m, int n) { 9 if(m == row && n == col) { 10 return 1; 11 } 12 if(row > m || col > n) { 13 return 0; 14 } 15 return helper(row+1, col, m, n) + helper(row, col+1, m, n); 16 }
代码很漂亮,我自己写的时候还犯了错,就是第五行,是(1,1,m,n),我写(0,0,m,n)了
方法二:
其实和我自己的方法是一种,但是他没有用一个二维来记录历史数据,选择了一维的数组,
我自己手写试了一下,体会如下:
1.两层循环都从1开始是因为第一行和第一列都被初始化成1,也就是res[0]始终是1
2.可以把二维变成一维是因为格子A的结果是同一列上一行+同一行上一列,同一列上一行就是这个数组这个位置残留下来的数,所以只要加上同一行上一列就好,也就是前一个数就好
简直不能更好看
1 public int uniquePaths(int m, int n) { 2 if(m<=0 || n<=0) 3 return 0; 4 int[] res = new int[n]; 5 res[0] = 1; 6 for(int i=0;i<m;i++) 7 { 8 for(int j=1;j<n;j++) 9 { 10 res[j] += res[j-1]; 11 } 12 } 13 return res[n-1]; 14 }
方法三:
这个是一个数学方法,我就比较捉急了。大意就是在(m-1)+(n-1)=m+n-2步中选m-1次横着走,看有多少种组合的方法,所以就是c(m-1)(m+n-2)
anyway这个就不写了= =