码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【牛客刷题-算法】NC34 不同路径的数目(一) | 动态规划、组合数解法


    文章目录

    • 1.题目描述
    • 2.算法设计思路与代码实现
    • 3.运行结果

    个人主页-CSDN:清风莫追

    🔥 该专栏作为刷题笔记,持续更新中。

    推荐一款面试、刷题神器牛客网:👉开始刷题学习👈


    1.题目描述

    描述
    一个机器人在m×n大小的地图的左上角(起点)。
    机器人每次可以向下或向右移动。机器人要到达地图的右下角(终点)。
    可以有多少种不同的路径从起点走到终点?
    在这里插入图片描述

    备注:m和n小于等于100,并保证计算结果在int范围内
    数据范围:0 < n,m \le 1000 要求:空间复杂度 O(nm)O(nm),时间复杂度 O(nm)O(nm)
    进阶:空间复杂度 O(1)O(1),时间复杂度 O(min(n,m))O(min(n,m))

    2.算法设计思路与代码实现

    思路一:动态规划,递归实现

    只需明白一件事,因为机器人只能向右或向下走,那么我们要到达 ( m , n ) (m,n) (m,n)点,有两种方式:

    1. 从 ( m − 1 , n ) (m-1,n) (m−1,n)点向下走一步
    2. 从 ( m , n − 1 ) (m,n-1) (m,n−1)点向右走一步

    则从起点到达 ( m , n ) (m,n) (m,n)点的路径数,就等于从起点到达 ( m − 1 , n ) (m-1,n) (m−1,n)的路径数与到达 ( m , n − 1 ) (m,n-1) (m,n−1)的路径数之和。

    在这里插入图片描述
    时间复杂度为 o ( m + n ) o(m+n) o(m+n)

    代码实现

    	int uniquePaths(int m, int n) {
            if(m == 1 || n == 1)
            {
                return 1;
            }
            return uniquePaths(m-1, n) + uniquePaths(m, n-1);
        }
    

    思路二:组合数

    对于 m ∗ n m*n m∗n的地图,从左上角到右下角一共需要走 m + n − 2 m+n-2 m+n−2步,其中 m − 1 m-1 m−1步向下, n − 1 n-1 n−1步向右。那么这 m + n − 2 m+n-2 m+n−2步中哪些步是向下、哪些是向右呢?这就变成了一个组合问题。

    我们只需计算 C m + n − 2 m − 1 C_{m+n-2}^{m-1} Cm+n−2m−1​的值即可(也可求 C m + n − 2 n − 1 C_{m+n-2}^{n-1} Cm+n−2n−1​,它们是相等的)。

    代码实现

        int uniquePaths(int m, int n) {
            int all = m + n -2;
            int min = m < n ? m : n;
            long long result = 1;
            for(int a = 1, b = min; b <= all; a++, b++){
                result = result * b / a;
            }
            return result;
        }
    

    注意细节

    代码中变量result的类型为long long,而题目中提到了路径数不会超过32位的int。那为什么要用long long?这其实也是一个常见的问题,虽然运算结果本身不会溢出,但是仍然需要小心运算过程中的中间结果发生溢出。

    例如代码中,result = result * b / a;是先进行乘法运算然后进行除法运算的,可能在做乘法时就已经溢出了。

    一个疑惑

    代码可以通过牛客的测试集,但是我对循环中的这一语句感到疑惑:result = result * b / a;。它涉及到除法运算,如何保证不会出现不能整除的情况呢?然而在我有限的尝试中,它确实没出现问题。

    3.运行结果

    成功通过!

    在这里插入图片描述


    CSDN话题挑战赛第2期
    参赛话题:学习笔记

  • 相关阅读:
    【暴力剪枝】CF1708D
    Docker 学习笔记(五)-- 容器数据卷
    CoinGecko 播客:与 Cartesi 联合创始人 Erick 一起构建 Layer-2
    NO8---蓝桥杯JAVA--- 斐波那契升级版
    【PXIE301-211】基于PXIE总线的16路并行LVDS数据采集、4路低速、2路隔离RS422数据处理平台
    Express操作MongoDB【一.Express框架通过Mongoose模块操作MongoDB数据库;二.在接口中间件中使用Mongoose模块】
    VMware解决问题(5):本地无法ping通vmware虚拟机,但是vmware虚拟机可以访问外网
    访问修饰符你用对了吗
    CocosCreator 面试题(十二)Cocos Creator Label 的原理以及如何减少Drawcall
    vue3+elementui-plus实现无限递归菜单
  • 原文地址:https://blog.csdn.net/m0_63238256/article/details/127114674
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号