[leetcode] Unique Paths 从二维grid中找出所有的unique paths
原题:https://leetcode.com/problems/unique-paths/#/description
就是给了一个n*m的矩阵。从top-left顶点往bottom-right终点走。每次只能往bottom,或者往right走。(还不算太可怜,每次还有两种选择。往往我们只有一种选择。)。
目标是:找出unique path的个数。
思路:计算解个数的题多半是用DP。
1. dp[i][j]意义:从起点到位置(i, j)的路径总数。
2. 通项公式:
2.1: 为了到达(i,j)这个点,只可能是从(1)上面的点(i-1,j)来的,和(2) 左边的点(i,j-1)来的。所以dp[i][j] = dp[i-1][j] + dp[i][j-1]
2.2: 对于边界情况,及在最上面和最左边的情况。dp[0][j] = 1; dp[i][0] =1. [因为只能往右边和下面走]
3. 计算方向: 从上到下,从左到右。最终返回dp[m-1][n-1]
public class Solution { public int uniquePaths(int m, int n) { int[][] dp = new int[m][n]; for(int i=0;i<m;i++) { dp[i][0] = 1; } for(int j=0;j<n;j++) { dp[0][j] = 1; } for(int i=1; i<m;i++) { for(int j=1;j<n;j++) { dp[i][j] = dp[i-1][j]+ dp[i][j-1]; } } return dp[m-1][n-1]; } }
优化方法:
上面的解法使用了一个二维的DP数组。其实这题可以只用一个一维的DP数组就可以了。
思路:因为dp[i][j] = dp[i][j-1] + dp[i-1][j]. 所以,如果只有一维,那么可以把dp[i][j-1]看成dp[j-1]. 可以把dp[i-1][j]看成dp[j]. 然后把两个的和继续存在dp[j]中。
public class Solution { public int uniquePaths(int m, int n) { int[] dp = new int[n]; for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(j == 0) dp[j] = 1; else dp[j] = dp[j-1] + dp[j]; } } return dp[n-1]; } }
posted on 2017-03-15 09:09 coding4ever 阅读(110) 评论(0) 编辑 收藏 举报