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++实现从std::string类型到bool型的转换

    利用C++实现从std::string类型到bool型的转换

    利用C++实现从std::string类型到bool型的转换。需要的朋友可以过来参考下。希望对大家有所帮助
    2013-10-10
  • 浅谈QT内存泄漏

    浅谈QT内存泄漏

    本文主要介绍了浅谈QT内存泄漏,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • 浅谈C++中replace()方法

    浅谈C++中replace()方法

    C++编程语言中的string应用方式多样化,每一种应用方式都能帮助我们提实现特定的功能需求。在这里我们将会为大家详细介绍一下其中一个比较重要的用法,有关C++ replace()函数的应用方式,需要的朋友可以参考下
    2015-11-11
  • 详解C++中的左值,纯右值和将亡值

    详解C++中的左值,纯右值和将亡值

    C++中本身是存在左值,右值的概念,但是在C11中又出现了左值,纯右值,将亡值得概念;这里我们主要介绍这些值的概念,感兴趣的可以了解一下
    2022-09-09
  • C++超详细讲解智能指针

    C++超详细讲解智能指针

    为了解决内存泄漏的问题,C++中提出了智能指针。内存泄漏的产生原因有很多,即使我们正确的使用malloc和free关键字也有可能产生内存泄漏,如在malloc和free之间如果存在抛异常,那也会产生内存泄漏。这种问题被称为异常安全
    2022-06-06
  • C语言求两个字符串的最长公共子串

    C语言求两个字符串的最长公共子串

    这篇文章主要介绍了C语言求两个字符串的最长公共子串,实例分析了C语言操作字符串的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • C语言数据结构之单链表操作详解

    C语言数据结构之单链表操作详解

    链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。本文将和大家一起聊聊C语言中单链表的常用操作,感兴趣的可以学习一下
    2022-07-07
  • C语言模拟实现字符串库函数的示例讲解

    C语言模拟实现字符串库函数的示例讲解

    这篇文章主要为大家详细介绍了C语言模拟实现字符串库函数的具体方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-01-01
  • 深入解析C++编程中的纯虚函数和抽象类

    深入解析C++编程中的纯虚函数和抽象类

    这篇文章主要介绍了深入解析C++编程中的纯虚函数和抽象类,是C++入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • C++使用Kruskal和Prim算法实现最小生成树

    C++使用Kruskal和Prim算法实现最小生成树

    这篇文章主要介绍了C++使用Kruskal和Prim算法实现最小生成树,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01

最新评论