• Unique Paths II


    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.

    ref:

    水中的鱼: [LeetCode] Unique Paths II 解题报告

    [解题思路]
    和Unique Path一样的转移方程:
    Step[i][j] = Step[i-1][j] + Step[i][j-1] if Array[i][j] ==0
    or            = 0 if Array[i][j] =1
     
     1 public class Solution {
     2     public int uniquePathsWithObstacles(int[][] obstacleGrid) {
     3         int[][] ways = new int[obstacleGrid.length+1][obstacleGrid[0].length+1];
     4         if(obstacleGrid[0][0] == 1)
     5             return 0;
     6         ways[0][1] = 1;
     7         for(int i =1; i<= obstacleGrid.length; i++){
     8             for(int j = 1; j<=obstacleGrid[0].length; j++){
     9                 if(obstacleGrid[i-1][j-1] == 0){
    10                     ways[i][j] = ways[i-1][j]+ways[i][j-1];
    11                 }else{
    12                     ways[i][j] = 0;
    13                 }
    14             }
    15         }
    16         
    17         return ways[obstacleGrid.length][obstacleGrid[0].length];
    18     }
    19 }
     
     
    滚动数组
     1 class Solution {
     2 
     3 public int uniquePathsWithObstacles(int[][] obstacleGrid) {
     4         int row = obstacleGrid.length;
     5         if(row == 0) return 0; 
     6         int col = obstacleGrid[0].length;
     7         
     8         if(obstacleGrid[0][0] == 1)
     9             return 0;
    10         
    11         int[] paths = new int[col];
    12         paths[0] = 1; 
    13         for(int i = 0; i < row ; i++){
    14             for(int j = 0; j < col; j++){
    15                 if(obstacleGrid[i][j] == 1){
    16                     paths[j] = 0;
    17                 }else if(j > 0){
    18                     paths[j] = paths[j]+paths[j-1];
    19                 }
    20             }
    21         }
    22         return paths[col -1];
    23     }
    24 }
     
    public class Solution {
        public int uniquePathsWithObstacles(int[][] obstacleGrid) {
            int m = obstacleGrid.length;
            int n = obstacleGrid[0].length;
            int[][] steps = new int[m+1][n+1];
            for(int i = 0; i < n+1; i++){
                steps[m][i] = 0;
            }
            
            for(int i = 0; i < m+1; i++){
                steps[i][n] = 0;
            }
            
            steps[m-1][n] =1;
            
            for(int i = m-1; i>= 0; i--){
                for(int j = n-1; j >=0; j--){
                    if(obstacleGrid[i][j] == 1){
                        steps[i][j] = 0;
                    }else {
                       steps[i][j] = steps[i+1][j] + steps[i][j+1];
                    }
                }
            }
            
            return steps[0][0];
        }
    }
  • 相关阅读:
    发一个使用 GridView 对数据小类进行分别汇总的例子
    C#根据当前时间确定日期范围(本周、本月、本季度、本年度)
    软件开发人员的作战手册
    C#服务常用继成函数说明
    ServiceController控制windows服务
    不做沙和尚
    C#多线程(二) 如何操纵一个线程转
    C#多线程(一) 多线程的相关概念
    如何为windows服务添加安装程序(转)
    用C#开发Windows服务、自动安装注册(转)
  • 原文地址:https://www.cnblogs.com/RazerLu/p/3539144.html
Copyright © 2020-2023  润新知