☆打卡算法☆LeetCode 62、不同路径 算法解析

简介: “给定m * n带下的网格, 从网格左上角出发,求有多少条到右下角的路径。”

一、题目


1、算法题目

“给定m * n带下的网格, 从网格左上角出发,求有多少条到右下角的路径。”

题目链接:

来源:力扣(LeetCode)

链接:62. 不同路径 - 力扣(LeetCode) (leetcode-cn.com)


2、题目描述

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

网络异常,图片无法展示
|

示例 1:
输入: m = 3, n = 7
输出: 28
复制代码
示例 2:
输入:m = 3, n = 2
输出:3
复制代码


二、解题


1、思路分析

看到这种求出所有解的题,很容易就想到了动态规划。

这个首先要推算出来动态规划的方程,因为是从(0,0)触发,到(i,j)有dp[i][j]条路线。

求dp[i][j],要思考移动的方式:

  • 如果向下走,那么就是从dp[i-1,j]走过来
  • 如果向右走,那么就会从dp[i,j-1]走过来

因此得到动态规划方程:

dp[i,j] = dp[i-1,j]+dp[i,j-1]

因为dp[i,j]只有这两个方向可以过来,然后初始化数组,从dp[0,0]开始,参考代码如下。


2、代码实现

代码参考:

public class Solution {
    int[,] visited;
    int[,] memo;
    public int UniquePaths(int m, int n) {
        visited = new int[m, n];
        memo = new int[m, n];
        return dfs(m, n, 0, 0);
    }
    public int dfs(int m, int n, int i, int j) {
        if (i == m - 1 && j == n - 1) return 1;
        int sum = 0;
        // Let (i, j) be visited for current dfs recursion state
        visited[i, j] = 1;
        // Console.WriteLine(i + ", " + j);
        if (i + 1 < m && j < n && visited[i + 1, j] != 1) {
            sum += memo[i + 1, j] != 0 ? memo[i + 1, j] : dfs(m, n, i + 1, j);
        }
        if (i < m && j + 1 < n && visited[i, j + 1] != 1) {
            sum += memo[i, j + 1] != 0 ? memo[i, j + 1] : dfs(m, n, i, j + 1);
        }
        // Set (i, j) back to un-visited for former dfs recursion state
        visited[i, j] = 0;
        return memo[i, j] = sum;
    }
}
复制代码

网络异常,图片无法展示
|


3、时间复杂度

时间复杂度 : O(mn)

其中mn是矩阵的长宽,只需要遍历一遍矩阵即可求得答案。

空间复杂度: O(mn)

其中mn是矩阵的长宽。


三、总结

这道题使用动态规划解题,重点是递归方程的推算。

回过头再看一下递归方程:

dp[i,j] = dp[i-1,j]+dp[i,j-1]

这是从左上角开始,向下或者向右移动,然后推导而来。

那么遍历方程就是从左向右,向下遍历即可。



相关文章
|
3月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
3月前
|
机器学习/深度学习 算法 C++
【DFS/回溯算法】2016年蓝桥杯真题之路径之谜详解
题目要求根据城堡北墙和西墙箭靶上的箭数,推断骑士从西北角到东南角的唯一路径。每步移动时向正北和正西各射一箭,同一格不重复经过。通过DFS回溯模拟“拔箭”过程,验证路径合法性。已知箭数约束路径唯一,最终按编号输出行走顺序。
|
4月前
|
传感器 机器学习/深度学习 编解码
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
MATLAB|主动噪声和振动控制算法——对较大的次级路径变化具有鲁棒性
258 3
|
4月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
296 2
|
4月前
|
机器学习/深度学习 人工智能 搜索推荐
从零构建短视频推荐系统:双塔算法架构解析与代码实现
短视频推荐看似“读心”,实则依赖双塔推荐系统:用户塔与物品塔分别将行为与内容编码为向量,通过相似度匹配实现精准推送。本文解析其架构原理、技术实现与工程挑战,揭秘抖音等平台如何用AI抓住你的注意力。
1160 7
从零构建短视频推荐系统:双塔算法架构解析与代码实现
|
4月前
|
算法 数据可视化 异构计算
【车辆路径问题VRPTW】基于北极海鹦优化(APO)算法求解带时间窗的车辆路径问题VRPTW研究(Matlab代码实现)
【车辆路径问题VRPTW】基于北极海鹦优化(APO)算法求解带时间窗的车辆路径问题VRPTW研究(Matlab代码实现)
294 0
|
4月前
|
机器学习/深度学习 传感器 算法
基于全局路径的无人地面车辆的横向避让路径规划研究[蚂蚁算法求解](Matlab代码实现)
基于全局路径的无人地面车辆的横向避让路径规划研究[蚂蚁算法求解](Matlab代码实现)
254 8
|
4月前
|
算法 数据挖掘 区块链
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
基于遗传算法的多式联运车辆路径网络优优化研究(Matlab代码实现)
147 2
|
4月前
|
机器学习/深度学习 存储 算法
动态规划算法深度解析:0-1背包问题
0-1背包问题是经典的组合优化问题,目标是在给定物品重量和价值及背包容量限制下,选取物品使得总价值最大化且每个物品仅能被选一次。该问题通常采用动态规划方法解决,通过构建二维状态表dp[i][j]记录前i个物品在容量j时的最大价值,利用状态转移方程避免重复计算子问题,从而高效求解最优解。
592 1
|
4月前
|
算法 搜索推荐 Java
贪心算法:部分背包问题深度解析
该Java代码基于贪心算法求解分数背包问题,通过按单位价值降序排序,优先装入高价值物品,并支持部分装入。核心包括冒泡排序优化、分阶段装入策略及精度控制,体现贪心选择性质,适用于可分割资源的最优化场景。
367 1
贪心算法:部分背包问题深度解析

热门文章

最新文章

推荐镜像

更多
  • DNS