zoukankan      html  css  js  c++  java
  • leetcode(63)不同路径 2

    不同路径2

    解题思路:动态规划+自底向上+去除障碍

    class Solution {
        public int uniquePathsWithObstacles(int[][] obstacleGrid) {
            int xlen = obstacleGrid.length;
            int ylen = obstacleGrid[0].length;
            int min = Math.min(xlen,ylen);
            int max = Math.max(xlen,ylen);
            int[][] flags = new int[2][min];
            boolean minflags = false;
            boolean maxflags = false;
            int cur = 0;
            int sum = 0;
            if(min==xlen){
                for(int i=0;i<xlen+ylen-1;++i){
                    sum = 0;
                    for(int j=0;j<min;++j){
                        if(i-j>=0&&i-j<max){
                            if(obstacleGrid[j][i-j]==1){
                                flags[cur][j] = 0; 
                                if(j==0&&!minflags){
                                    minflags = true;
                                }
                                if(i-j==0&&!maxflags){
                                    maxflags = true;
                                }
                            }else{
                                if(j==0||i-j==0){
                                    if(j==0&&!minflags||i-j==0&&!maxflags){
                                        flags[cur][j] = 1; 
                                    }else{
                                        flags[cur][j] = 0;  
                                    }
                                }else{
                                    flags[cur][j] = flags[1-cur][j-1] + flags[1-cur][j];
                                }
                            }
                            sum += flags[cur][j];
                        }
                    }
                    if(sum==0){
                        return 0;
                    }
                    cur = 1 - cur;
                }
            }else{
                for(int i=0;i<xlen+ylen-1;++i){
                    sum = 0;
                    for(int j=0;j<min;++j){
                        if(i-j>=0&&i-j<max){
                            if(obstacleGrid[i-j][j]==1){
                                flags[cur][j] = 0; 
                                if(j==0&&!maxflags){
                                    maxflags = true;
                                }
                                if(i-j==0&&!minflags){
                                    minflags = true;
                                }
                            }else{
                                if(j==0||i-j==0){
                                    if(j==0&&!maxflags||i-j==0&&!minflags){
                                        flags[cur][j] = 1; 
                                    }else{
                                        flags[cur][j] = 0;  
                                    }
                                }else{
                                    flags[cur][j] = flags[1-cur][j-1] + flags[1-cur][j];
                                }
                            }
                            sum += flags[cur][j];
                        }
                    }
                    if(sum==0){
                        return 0;
                    }
                    cur = 1 - cur;
                }
            } 
            return flags[1-cur][min-1];
        }
    }
  • 相关阅读:
    LeetCode "Jump Game"
    LeetCode "Pow(x,n)"
    LeetCode "Reverse Linked List II"
    LeetCode "Unique Binary Search Trees II"
    LeetCode "Combination Sum II"
    LeetCode "Divide Two Integers"
    LeetCode "First Missing Positive"
    LeetCode "Clone Graph"
    LeetCode "Decode Ways"
    LeetCode "Combinations"
  • 原文地址:https://www.cnblogs.com/erdanyang/p/11248893.html
Copyright © 2011-2022 走看看