LeetCode - Unique Paths II | Darren's Blog



Follow up for LeetCode - 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.
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
dp[i][j]={0dp[i1][j]+dp[i][j1]if grid[i][j]=1otherwise.

Then we can scan the grid in the row-major manner and update dp[i][j] accordingly. Finally,dp[m1][n1] is what we want. Since dp[i][j] depend on grid[i][j] and the two cells to its left and top, a whole table for dp is not necessary; an array of length n suffices (or of lengthm , depending on the implementation). To avoid boundary check, an array of length n+1 is used below.
O(n) Space, code from http://www.darrensunny.me/leetcode-unique-paths-ii/
public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        if (obstacleGrid == null || obstacleGrid.length == 0 ||
                obstacleGrid[0].length == 0)
            return 0;
        int m = obstacleGrid.length, n = obstacleGrid[0].length;
        int[] dp = new int[n+1];
        dp[1] = 1;      // Initialization: one unique path to the starting point
        // Compute the number of unique paths to obstacleGrid[i][j]
        // Normally, it equals to the sum of the number of unique paths to obstacleGrid[i][j-1]
        // and that to obstacleGrid[i-1][j], except the case when the cell contains obstacles
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (obstacleGrid[i][j] == 1)    // Obstacle
                    dp[j+1] = 0;    // Cannot reach a cell containing obstacle
                else        // Empty space
                    dp[j+1] += dp[j];
            }
        }
 
        return dp[n];
    }
Don't use extra space
Code from http://blog.csdn.net/kenden23/article/details/17317805
int uniquePathsWithObstacles(vector<vector<int> > &obstacleGrid) {
int r = obstacleGrid.size();
if (r < 1) return 1;
int c = obstacleGrid[0].size();
vector<int> table(c);
if (obstacleGrid[0][0] == 1) return 0;
else table[0] = 1;
for (int i = 1; i < c && obstacleGrid[0][i] != 1; i++)
{
table[i] = 1;
}
for (int i = 1; i < r; i++)
{
//注意:如果是只有单列的时候,每列需要初始化
//注意:不等于1的时候是填回上一列的值,并非初始化为1
if (obstacleGrid[i][0] == 1) table[0] = 0;
for (int j = 1; j < c; j++)
{
if (obstacleGrid[i][j] != 1)
table[j] += table[j-1];
else table[j] = 0;
}
}
return table[c-1];
}
O(m*N) space: Code from http://yucoding.blogspot.com/2013/04/leetcode-question-117-unique-path-ii.html
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();
         
        vector<vector<int> > arr(m,vector<int>(n,0));
         
        if (obstacleGrid[0][0]==1){return 0;}
        arr[0][0]=1;
        for (int i=1;i<m;i++){
            if (obstacleGrid[i][0]!=1){
                arr[i][0] = arr[i-1][0];
            }
        }
        for (int i=1;i<n;i++){
            if (obstacleGrid[0][i]!=1){
                arr[0][i] = arr[0][i-1];
            }
        }
        for (int i=1;i<m;i++){
            for(int j=1;j<n;j++){
                if (obstacleGrid[i][j]!=1){
                    arr[i][j] = arr[i][j-1] + arr[i-1][j];
                }
            }
        }  
        return arr[m-1][n-1];
    }

Read full article from LeetCode - Unique Paths II | Darren's Blog

No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts