前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 75 —— 62. 不同路径

LeetCode 75 —— 62. 不同路径

作者头像
Regan Yue
发布2023-07-10 14:45:28
1500
发布2023-07-10 14:45:28
举报
文章被收录于专栏:ReganYue's Blog

LeetCode 75 —— 62. 不同路径

一、题目描述:

一个机器人位于一个 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 * 10^9 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/unique-paths 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

这道题考察了什么思想?你的思路是什么?

面对这道题目我的第一想法是能不能找寻规律,利用排列组合的方法解题,虽然我没有找到哈~但是我看题解有找到规律的:

image-20221023173536405
image-20221023173536405

这个规律其实不太好找,不过我们根据第一个m=3,n=2的例子,可以发现,我们到这里可以有向下一步,向右两步,就一定能到达终点。

然后我又想了动态规划的方法,这道题应该是一道典型的动态规划题目,我们将起点到每一个点的路径设置为到其左边那个点的路径条数加上到其上面那个点的路径条数之和。所以有动态规划转移方程:

代码语言:javascript
复制
f(x,y) = f(x-1)(y) + f(x)(y-1)

不过需要注意的是,我们要将f(x,0)和f(0,y)的值设置为1。很好就可以理解,确实到他们的路径只有一条!

做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

不是一次通过的,注意什么时候用m,什么时候用n。我刚开始在此处有些失误!

有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

动态规划优化:因为我们每次只记录需要 dp[i-1][j],dp[i][j-1]

代码语言:javascript
复制
class Solution {
    public int uniquePaths(int m, int n) {
        int[] pre = new int[n];
        int[] cur = new int[n];
        Arrays.fill(pre, 1);
        Arrays.fill(cur,1);
        for (int i = 1; i < m;i++){
            for (int j = 1; j < n; j++){
                cur[j] = cur[j-1] + pre[j];
            }
            pre = cur.clone();
        }
        return pre[n-1]; 
    }
}

作者:powcai
链接:https://leetcode.cn/problems/unique-paths/solution/dong-tai-gui-hua-by-powcai-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
代码语言:javascript
复制
class Solution {
    public int uniquePaths(int m, int n) {
        int[] cur = new int[n];
        Arrays.fill(cur,1);
        for (int i = 1; i < m;i++){
            for (int j = 1; j < n; j++){
                cur[j] += cur[j-1] ;
            }
        }
        return cur[n-1];
    }
}

作者:powcai
链接:https://leetcode.cn/problems/unique-paths/solution/dong-tai-gui-hua-by-powcai-2/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三、AC 代码:

代码语言:javascript
复制
func uniquePaths(m int, n int) int {
    dp := make([][]int,m)
    for i := range dp{
        dp[i] = make([]int,n)
        dp[i][0] = 1
    }
    for i:=0;i<n;i++{
        dp[0][i] = 1
    }

    for i:=1;i<m;i++{
        for j:=1;j<n;j++{
            dp[i][j] = dp[i-1][j] + dp[i][j-1]
        }
    }
    return dp[m-1][n-1]
}

四、总结:

空间复杂度可以优化到O(n),当然O(2n)的解法上面也介绍了。如果使用组合数学可以使空间复杂度降到O(1),时间复杂度降到O(m)。

image-20221023180742317
image-20221023180742317
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • LeetCode 75 —— 62. 不同路径
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档