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];
        }
    }
  • 相关阅读:
    openfalcon源码分析之transfer
    openfalcon源码分析之hbs
    openfalcon源码分析之Judge
    kong插件官方文档翻译
    Lua 学习
    GO语言heap剖析及利用heap实现优先级队列
    GO语言list剖析
    算法之python创建链表实现cache
    杂项之rabbitmq
    杂项之python利用pycrypto实现RSA
  • 原文地址:https://www.cnblogs.com/erdanyang/p/11248893.html
Copyright © 2011-2022 走看看