我的思路:
1、一个机器人在矩阵的(0,0)点处,到达(i,j)处,只能往下或者右走,有多少种路径?
2、这里由于在每个点只能往下或者往右,只有两种可能,所以走过的点的数量是确定的,而且往每个方向的数目也是确定的,利用组合公式C(n,m) = n! / (m! * (n - m)!。
代码如下:
int uniquePaths(int m, int n) {
if (m <= 0 || n <= 0)
return 0;
int up = m + n - 2;
int down_min = m < n ? (m - 1) : (n - 1);
int down_max = m > n ? (m - 1) : (n - 1);
long long int ans_up = 1, ans_down = 1;
for (int i = down_max + 1; i <= m + n - 2; i++)
ans_up *= i;
for (int i = 1; i <= down_min; i++)
ans_down *= i;
return ans_up / ans_down;
}
其他思路:
1、这个可以用递推来思考,到达最后一个点 f[i][j] 的时候,只有两种情况,来自上方或者左边的点。所以有公式 f[i][j] = f[i - 1][j] + f[i][j - 1]。
2、初始化第一行第一列的值为1。开始循环求出每个点的值。
我的思路:
1、这题运用和上题递推的思路就可以了,只要把初始值设定好之后就用循环生成结果。
2、用-1来表示障碍物,因为1要作为结果来表示。
代码如下:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
int size = obstacleGrid.size();
if (size == 0)
return 0;
int len = obstacleGrid[0].size();
vector<vector<int>> ans = obstacleGrid;
int start = ans[0][0];
for (int i = 0; i < len; i++)
if (ans[0][i] == 1) {
for (int j = i; j < len; j++)
ans[0][j] = -1;
break;
}
else
ans[0][i] = 1;
//第一列要从头开始初始化,如果第一个是障碍物,而且只有一列,从第二列开始初始化就会有问题
ans[0][0] = start;
for (int i = 0; i < size; i++)
if (ans[i][0] == 1) {
for (int j = i; j < size; j++)
ans[j][0] = -1;
break;
}
else
ans[i][0] = 1;
for (int i = 1; i < size; i++)
for (int j = 1; j < len; j++)
if (ans[i][j] != 1)
ans[i][j] = (ans[i - 1][j] == -1 ? 0 : ans[i - 1][j]) + (ans[i][j - 1] == -1 ? 0 : ans[i][j - 1]);
else
ans[i][j] = -1;
return ans[size - 1][len - 1] == -1 ? 0 : ans[size - 1][len - 1];
}
优化思路:
1、其实不需要-1来表示有障碍物,我们用原来数组中的数据就可以表示,在结果中走不通的点就设置为0。
优化代码:
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
int size = obstacleGrid.size();
if (size == 0)
return 0;
int len = obstacleGrid[0].size();
vector<vector<int>> ans = obstacleGrid;
for (int i = 0; i < len; i++)
if (obstacleGrid[0][i] == 1) { //这里的if else语句可以改称条件判断式,代码长度减小很多
for (int j = i; j < len; j++)
ans[0][j] = 0;
break;
}
else
ans[0][i] = 1;
for (int i = 0; i < size; i++)
if (obstacleGrid[i][0] == 1) { //同上
for (int j = i; j < size; j++)
ans[j][0] = 0;
break;
}
else
ans[i][0] = 1;
for (int i = 1; i < size; i++)
for (int j = 1; j < len; j++)
if (obstacleGrid[i][j] == 0)
ans[i][j] = ans[i - 1][j] + ans[i][j - 1];
else
ans[i][j] = 0;
return ans[size - 1][len - 1];
}