zoukankan      html  css  js  c++  java
  • Unique Paths I,II

    题目来自于:https://leetcode.com/problems/unique-paths/

    :https://leetcode.com/problems/unique-paths-ii/

    A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).

    The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

    How many possible unique paths are there?


    Above is a 3 x 7 grid. How many possible unique paths are there?

    Note: m and n will be at most 100.

    这道题目就是典型的动态规划问题。之所以会写博客也是由于被网上的第二种算法吸引了。

    典型的解法记住空间复杂度要在O(n)

    class Solution {
    public:
        int uniquePaths(int m, int n) {
           vector<int> paths(n,1);
           for(int i=1;i<m;i++)
             for(int j=1;j<n;j++)  
                paths[j]+=paths[j-1];
           return paths[n-1];
        }
    };

    另外一种是採用排列组合的方法来解答的

    我们从左上角走到右下角一共要(m-1)+(n-1)步而当中我们能够选择(m-1)+(n-1)随意的(m-1)步向右,或者是(n-1)步向下。所以问题的答案就是Ian单的


    这样的解法的缺点是可能在m。n取较大的数值时候无法储存。所以此处我们採用long int,

    class Solution {
    public:
        int uniquePaths(int m, int n) {// (m-1 + n-1)! / ((m-1)! * (n-1)!)
        int large = max(m,n) -1;
        int small = min(m,n) -1;
        if (large == 0 || small == 0) return 1;
        long int numerator = 1, denominator = 1;
        for (int i=1; i<=small; ++i){
            numerator *= large + i;
            denominator *= i;
        }
        return numerator/denominator;
        }
    };

    Unique Paths II

     Total Accepted: 35700 Total Submissions: 127653My Submissions

    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.

    这里仅仅是加了障碍物而已。在障碍物的位子是0,

    还有初始化仅仅能初始化第一个位子即起点。假设起点不是障碍物则为1,否则是0;

    class Solution {
    public:
        int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
           vector<int> paths(obstacleGrid[0].size(),0);
           paths[0]=!obstacleGrid[0][0];
           for(int i=0;i<obstacleGrid.size();++i)
               for(int j=0;j<obstacleGrid[0].size();++j)
                   if(obstacleGrid[i][j]==1)
                      paths[j]=0;
                    else if(j-1>=0)
                       paths[j]+=paths[j-1];
           return paths[obstacleGrid[0].size()-1];
        }
    };




  • 相关阅读:
    记录一下 一个复杂SQL的执行效率分析
    1582 Incorrect parameter count in the call to native function 'FIND_IN_SET'
    教我兄弟学Android逆向10 静态分析反调试apk
    教我兄弟学Android逆向09 IDA动态破解登陆验证
    教我兄弟学Android逆向08 IDA爆破签名验证
    教我兄弟学Android逆向07 IDA破解第一个so
    教我兄弟学Android逆向06 用AndroidStudio编写第一个so
    教我兄弟学Android逆向05 在smali代码中插入Log
    教我兄弟学Android逆向04 动态调试smali代码
    教我兄弟学Android逆向03 破解第一个Android游戏
  • 原文地址:https://www.cnblogs.com/mthoutai/p/6911632.html
Copyright © 2011-2022 走看看