标签:mat 代码 new c++ color solution div for span
一:解题思路
方法一:利用动态规划的思想来做,用一个二维数组d[m][n]来表示每个格子的路径数量。对于第一行:d[0][j]=1。对于第一列:d[i][0]=1。对于其他位置的路径数量。d[i][j]=d[i-1][j]+d[i][j-1]。Time:O(m*n),Space:O(m*n)
方法二:这道题目可以高效的利用排列组合的方法来做,从左上角走到右下角,不管怎么走,必须向右走n-1步,必须向下走m-1步。一共总共要走m+n-2步。Time:O(min(m,n)),Space:O(1)
二:完整代码示例 (C++版和Java版)
方法一C++:
class Solution { public: int uniquePaths(int m, int n) { if (m < 1 || n < 1) return 0; vector<vector<int>> d(m,vector<int>(n)); for (int j = 0; j < n; j++) d[0][j] = 1; for (int i = 0; i < m; i++) d[i][0] = 1; for (int i = 1; i < m; i++) for (int j = 1; j < n; j++) d[i][j] = d[i-1][j] + d[i][j-1]; return d[m-1][n-1]; } };
方法一Java:
class Solution { public int uniquePaths(int m, int n) { if(m<1 || n<1) return 0; int[][] d=new int[m][n]; for(int j=0;j<n;j++) d[0][j]=1; for(int i=0;i<m;i++) d[i][0]=1; for(int i=1;i<m;i++) { for(int j=1;j<n;j++) { d[i][j]=d[i-1][j]+d[i][j-1]; } } return d[m-1][n-1]; } }
方法二C++:
class Solution { public: int uniquePaths(int m, int n) { if (m < 1 || n < 1) return 0; int small = min(m-1,n-1); int total = m + n - 2; long result = 1.0; for (int i = 0; i < small; i++) { result = result * (total - i) / (i+1); } return (int)result; } };
方法二Java:
class Solution { public int uniquePaths(int m, int n) { if(m<1 || n<1) return 0; int small=Math.min(m-1,n-1); int total=m+n-2; long result=1; for(int i=0;i<small;i++) { result=result*(total-i)/(i+1); } return (int)result; } }
标签:mat 代码 new c++ color solution div for span
原文地址:https://www.cnblogs.com/repinkply/p/12681195.html