class Solution {
public:
long long pailei(int m) {
long long res=1;
int i=m;
while (i>0) {
res *=i;
i--;
}
return res;
}
int uniquePaths(int m, int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
long long res=pailei(m+n-2)/pailei(m-1)/pailei(n-1);
return res;
}
};A little bit improved, but still cannot pass the large judge
class Solution {
public:
long long pailei(int m, int n) {
long long res=1;
int i=m;
while (i>n) {
res *=i;
i--;
}
return res;
}
int uniquePaths(int m, int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
long long res=pailei(m+n-2,m-1)/pailei(n-1,0);
return res;
}
};
use DP
class Solution {
public:
int uniquePaths(int m, int n) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int res[m][n];
for (int i=0; i<m; i++) {
res[i][n-1]=1;
}
for (int i=0; i<n; i++) {
res[m-1][i]=1;
}
for (int i=m-2; i>=0; i--) {
for (int j=n-2; j>=0; j--) {
res[i][j]=res[i][j+1]+res[i+1][j];
}
}
return res[0][0];
}
};II
DFS:
class Solution {
public:
void dfs(vector<vector<int> > &obstacleGrid, int &res, int x, int y) {
if (x>obstacleGrid.size()-1 || y>obstacleGrid[0].size()-1) return;
if (obstacleGrid[x][y]==1) return;
if (x==obstacleGrid.size()-1 && y==obstacleGrid[0].size()-1) {
res++;
return;
}
dfs(obstacleGrid, res, x, y+1);
dfs(obstacleGrid, res, x+1, y);
}
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
if (obstacleGrid.size()==0) return 0;
int res=0;
dfs(obstacleGrid, res, 0, 0);
return res;
}
};
好吧,递归会超时
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
int m=obstacleGrid.size();
int n=obstacleGrid[0].size();
int res[m][n];
if (obstacleGrid[m-1][n-1]==1) return 0;
else res[m-1][n-1]=1;
for (int i=m-2; i>=0; i--) {
if (obstacleGrid[i][n-1]==1) {
res[i][n-1]=0;
}else {
res[i][n-1]=res[i+1][n-1];
}
}
for (int i=n-2; i>=0; i--) {
if (obstacleGrid[m-1][i]==1) {
res[m-1][i]=0;
}else {
res[m-1][i]=res[m-1][i+1];
}
}
for (int i=m-2; i>=0; i--) {
for (int j=n-2; j>=0; j--) {
if (obstacleGrid[i][j]==1) {
res[i][j]=0;
}else {
res[i][j]=res[i][j+1]+res[i+1][j];
}
}
}
return res[0][0];
}
};14/2/17:
class Solution {
public:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
int m=obstacleGrid.size();
if (m==0) return 0;
int n=obstacleGrid[0].size();
if (obstacleGrid[m-1][n-1]==1) return 0;
vector<int> res(n+1,0);
if (obstacleGrid[0][0]==0) res[1]=1;
for (int i=0; i<m; i++) {
for (int j=0; j<n; j++) {
res[j+1] = obstacleGrid[i][j]==1? 0:res[j+1]+res[j];
}
}
return res[n];
}
};
389

被折叠的 条评论
为什么被折叠?



