63. Unique Paths II

来源:互联网 发布:网络安全保密协议 编辑:程序博客网 时间:2024/05/17 00:58

题目:

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][n];    }};
优化空间复杂度,没有使用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];    }};


0 0
原创粉丝点击