zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    Vue3手册译稿
    捉虫日记 | MySQL 5.7.20 try_acquire_lock_impl 异常导致mysql crash
    window资源管理器无反应,右键转圈圈
    二、DHCP原理简介
    一、以太网协议
    FreeRTOS系统环境下,全局变量频繁同时在不同任务改写也可能导致硬件中断(HardFault)
    查找生成文件的进程
    解决docker容器无法访问宿主机网络的问题
    TiDB在更新版本的时候初始化Prometheus的配置文件失败
    好喜欢lodop的介绍
  • 原文地址:https://www.cnblogs.com/Deribs4/p/5651279.html
Copyright © 2011-2022 走看看