现在的位置: 首页 > 综合 > 正文

Unique Paths & Unique Paths II

2017年12月22日 ⁄ 综合 ⁄ 共 1870字 ⁄ 字号 评论关闭

Unique Paths

我的思路:

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。开始循环求出每个点的值。

Unique Paths II

我的思路:

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];
    }

抱歉!评论已关闭.