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这个就不写了= =

 

posted @ 2016-03-05 09:30  warmland  阅读(150)  评论(0编辑  收藏  举报