C++实现LeetCode(62.不同的路径)

 更新时间:2021年07月16日 14:46:50   作者:Grandyang  
这篇文章主要介绍了C++实现LeetCode(62.不同的路径),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下

[LeetCode] 62. Unique Paths 不同的路径

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 7 x 3 grid. How many possible unique paths are there?

Note: m and n will be at most 100.

Example 1:

Input: m = 3, n = 2
Output: 3
Explanation:
From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
1. Right -> Right -> Down
2. Right -> Down -> Right
3. Down -> Right -> Right

Example 2:

Input: m = 7, n = 3
Output: 28

这道题让求所有不同的路径的个数,一开始还真把博主难住了,因为之前好像没有遇到过这类的问题,所以感觉好像有种无从下手的感觉。在网上找攻略之后才恍然大悟,原来这跟之前那道 Climbing Stairs 很类似,那道题是说可以每次能爬一格或两格,问到达顶部的所有不同爬法的个数。而这道题是每次可以向下走或者向右走,求到达最右下角的所有不同走法的个数。那么跟爬梯子问题一样,需要用动态规划 Dynamic Programming 来解,可以维护一个二维数组 dp,其中 dp[i][j] 表示到当前位置不同的走法的个数,然后可以得到状态转移方程为:  dp[i][j] = dp[i - 1][j] + dp[i][j - 1],这里为了节省空间,使用一维数组 dp,一行一行的刷新也可以,代码如下:

解法一:

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

这道题其实还有另一种很数学的解法,实际相当于机器人总共走了 m + n - 2步,其中 m - 1 步向右走,n - 1 步向下走,那么总共不同的方法个数就相当于在步数里面 m - 1 和 n - 1 中较小的那个数的取法,实际上是一道组合数的问题,写出代码如下:

解法二:

class Solution {
public:
    int uniquePaths(int m, int n) {
        double num = 1, denom = 1;
        int small = m > n ? n : m;
        for (int i = 1; i <= small - 1; ++i) {
            num *= m + n - 1 - i;
            denom *= i;
        }
        return (int)(num / denom);
    }
};

到此这篇关于C++实现LeetCode(62.不同的路径)的文章就介绍到这了,更多相关C++实现不同的路径内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++产生随机数的实现代码

    C++产生随机数的实现代码

    本篇文章是对C++中产生随机数的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • QT与MATLAB混合编程的详细教程

    QT与MATLAB混合编程的详细教程

    最近项目需要,matlab的一些算法需要工程用,因此需要直接转成Qt能够调用的形式,下面这篇文章主要给大家介绍了关于QT与MATLAB混合编程的相关资料,需要的朋友可以参考下
    2023-01-01
  • linux之sort命令的用法

    linux之sort命令的用法

    sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出
    2013-10-10
  • C++ Boost Tokenizer使用详细讲解

    C++ Boost Tokenizer使用详细讲解

    Boost是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库是一个可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一,是为C++语言标准库提供扩展的一些C++程序库的总称
    2022-11-11
  • C++ atoi()函数用法案例详解

    C++ atoi()函数用法案例详解

    这篇文章主要介绍了C++ atoi()函数用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • c++实现简单随机数的代码

    c++实现简单随机数的代码

    在本篇文章里小编给大家整理的是一篇关于c++实现简单随机数的代码内容,有需要的朋友们可以跟着学习下。
    2021-05-05
  • C语言编程C++柔性数组结构示例讲解

    C语言编程C++柔性数组结构示例讲解

    这篇文章主要介绍了C语言编程系列中的柔性数组,文中含有详细的示例代码讲解,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • C语言数组应用实现扫雷游戏

    C语言数组应用实现扫雷游戏

    这篇文章主要为大家详细介绍了C语言数组应用实现扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • 双向链表插入删除基本应用介绍

    双向链表插入删除基本应用介绍

    本文将详细介绍建立双向链表,实现对双向链表的插入,删除操作,需要了解的朋友可以参考下
    2012-11-11
  • C++火车入轨算法的实现代码

    C++火车入轨算法的实现代码

    这篇文章主要介绍了C++火车入轨算法的实现代码,有需要的朋友可以参考一下
    2013-12-12

最新评论