• Leetcode 62. Unique Paths


    62. Unique Paths

    • Total Accepted: 93894
    • Total Submissions:253450
    • Difficulty: Medium

    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.

    思路:

    方法一:设定数组d,其中d[i][j](i>=0,j>=0)意味着到(i+1,j+1)的位置有的路径。显然当i==0或者j==0时,d[i][j]=1;其他条件下,d[i][j]=d[i-1][j]+d[i][j-1]。

    方法二:从排列组合的角度出发,d[i][j]=C(i+j,i)=C(i+j,j)。

    代码:

    方法一:

    没有优化之前的代码,空间复杂度是m*n。

     1 class Solution {
     2 public:
     3     int uniquePaths(int m, int n) {
     4         vector<vector<int>> cur(m,vector<int>(n,0));
     5         int i,j;
     6         for(i=0;i<m;i++){
     7             cur[i][0]=1;
     8         }
     9         for(j=0;j<n;j++){
    10             cur[0][j]=1;
    11         }
    12         for(i=1;i<m;i++){
    13             for(j=1;j<n;j++){
    14                 cur[i][j]=cur[i-1][j]+cur[i][j-1];
    15             }
    16         }
    17         return cur[m-1][n-1];
    18     }
    19 };

    其实,

    1. (i,0)和(0,j)(其中0<=i<m,0<=j<n)的路径数=1。所以初始化vector的元素都为1。

    2. (i,j)路径数(i!=0||j!=0)=(i-1,j)路径数+(i,j-1)路径数。所以只要一个vector记录(i,j)的路径数,其中vector元素坐标只与j有关。

    优化以后的代码:空间复杂度是2*max(m,n)

     1 class Solution {
     2 public:
     3     int uniquePaths(int m, int n) {
     4         vector<int> cur(n,1);//初始化为n个1
     5         int i,j;
     6         for(i=1;i<m;i++){
     7             for(j=1;j<n;j++){
     8                 cur[j]+=cur[j-1];
     9             }
    10         }
    11         return cur[n-1];
    12     }
    13 };

    方法二:
    关于循环中的乘积为什么这么写,暂时没有想清楚。

     1 class Solution {
     2 public:
     3     int uniquePaths(int m, int n) {
     4         int N=m-1+n-1;
     5         int k=m-1;
     6         int i;
     7         double pro=1;
     8         for(i=1;i<=k;i++){
     9             pro=pro*(N-k+i)/i;//改成pro*=(N-k+i)/i;结果就是错的 
    10         }
    11         return round(pro);
    12     }
    13 };
  • 相关阅读:
    js与设计模式访问者模式
    js与设计模式外观模式
    由一个小Bug推及ie及ff的dom元素差异
    构建一个前端库做一个富客户端的基类
    [原创]LINQ 学习系列教程文章索引
    Sublime Text 2 性感无比的代码编辑器!程序员必备神器!跨平台支持Win/Mac/Linux
    Ubuntu分区
    非常不错的WCF入门文章,来自Artech
    助记:MIME类型
    F#学习存疑求解答:关于使用Cotinuation仍然堆栈溢出的问题
  • 原文地址:https://www.cnblogs.com/Deribs4/p/5651279.html
Copyright © 2020-2023  润新知