LeetCode62 不同路径

题目

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start”)。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?

 示例 1: 
输入:m = 3, n = 7
输出:28 

 示例 2: 
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下

 示例 3: 
输入:m = 7, n = 3
输出:28

 示例 4: 
输入:m = 3, n = 3
输出:6 

 提示: 
 1 <= m, n <= 100 
 题目数据保证答案小于等于 2 * 109 

方法

动态规划

节点[i,j]的情况即为左节点和上节点的情况相加,即动态规划的方程为dp[i,j] = dp[i-1,j]+dp[i,j-1]

  • 时间复杂度:O(m*n)
  • 空间复杂度:O(m*n)
class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[n][m];
        for(int i=0;i<n;i++){
            for(int j=0;j<m;j++){
                if(i==0||j==0){
                    dp[i][j] = 1;
                }else{
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        }
        return dp[n-1][m-1];
    }
}

数学公式法

向右走有n-1步,向下走有m-1步,因此题意为在m+n-2的情况下选m-1次向下的情况个数,公式即为:
image

  • 时间复杂度:O(m)
  • 空间复杂度:O(1)
class Solution {
    public int uniquePaths(int m, int n) {
        long ans = 1;
        for (int x = n, y = 1; y < m; ++x, ++y) {
            ans = ans * x / y;
        }
        return (int) ans;
    }
}
posted @   你也要来一颗长颈鹿吗  阅读(22)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示