您的位置:首页 > 产品设计 > UI/UE

63. Unique Paths II

2016-05-11 16:20 375 查看
题目:

Follow up for "Unique Paths":

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space is marked as
1
and
0
respectively
in the grid.

For example,

There is one obstacle in the middle of a 3x3 grid as illustrated below.
[
[0,0,0],
[0,1,0],
[0,0,0]
]


The total number of unique paths is
2
.

Note: m and n will be at most 100.

题意:

与Unique Paths题目类似,本题中包含一些阻碍,有阻碍的地方不能经过。空间复杂度O(m*n);

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        
        vector<vector<int>> result(m+1, vector<int>(n+1, 0));
        
        result[0][1] = 1;
        
        for(int i=1; i<=m; i++){
            for(int j=1; j<=n; j++){
                if(!obstacleGrid[i-1][j-1]){
                    result[i][j] = result[i-1][j] + result[i][j-1];
                }
            }
        }
        
        return result[m]
;
    }
};
优化空间复杂度,没有使用m*n大小的数组存储所有元素的可到达路径数,使用了两个小数组。

代码:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        
        vector<int> pre(m, 0);
        vector<int> cur(m, 0);
        
        for(int i=0; i<m; i++){
            if(!obstacleGrid[i][0]){
                pre[i] = 1;
            }else{
                break;
            }
        }
        
        for(int j=1; j<n; j++){
            bool flag = false;
            if(!obstacleGrid[0][j]){
                cur[0] = pre[0];
                if(cur[0]){
                    flag = true;
                }
            }else{
                cur[0] = 0;
            }
            
            for(int i=1; i<m; i++){
                if(!obstacleGrid[i][j]){
                    cur[i] = cur[i-1] + pre[i];
                    if(cur[i]){
                        flag = true;
                    }
                }else{
                    cur[i] = 0;
                }
            }
            
            if(!flag){
                return 0;
            }
            
            swap(pre, cur);
        }
        
        return pre[m-1];
    }
};
再次优化空间复杂度。使用一个小数组存储必要的数。

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        
        vector<int> cur(m, 0);
        
        for(int i=0; i<m; i++){
            if(!obstacleGrid[i][0]){
                cur[i] = 1;
            }else break;
        }
        
        for(int j=1; j<n; j++){
            bool flag = false;
            if(obstacleGrid[0][j]){
                cur[0] = 0;
            }else flag = true;
            
            for(int i=1; i<m; i++){
                if(!obstacleGrid[i][j]){
                    cur[i] += cur[i-1];
                    if(cur[i]){
                        flag = true;
                    }
                }else cur[i] = 0;
            }
            
            if(!flag){
                return 0;
            }
        }
        
        return cur[m-1];
    }
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: