算法每日一练 (19)

欢迎来到张翊尘的技术站
技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌

文章目录

  • 算法每日一练 (19)
    • 不同路径
      • 题目描述
      • 解题思路
      • 解题代码
        • `c/c++`
        • `golang`
        • `lua`

官方站点: 力扣 Leetcode

算法每日一练 (19)

不同路径

题目地址:不同路径

题目描述

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

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

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

示例 1:

算法每日一练 (19)_第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

解题思路

  • 由题意可知,矩阵中的每个节点只能从上面或者左边到达,也就是说到达某个节点的路径数应该是到达上面节点路径数加上达到左边节点的路径数
  • 又因为最上面一层 m = 0 不存在 “上面的节点”;最左边的一列 n = 0 不存在 “左边的节点”,故某个节点在这两种情况下到达只有一种可能。
  • 综上所述,除下 m = 0n = 0 的情况外,其他的节点应该满足如下公式:

d p [ j ] = d p [ j ] + d p [ j − 1 ] dp[j] = dp[j] + dp[j - 1] dp[j]=dp[j]+dp[j1]

  • 创建 dp 辅助数组,首先初始化第一层的每个节点到达的路径数都是 1。
  • 紧接着,借助循环从第二层开始,根据上述公式,计算每个节点到达的路径数。
  • 最终,返回 dp[n - 1] 最后一层的最后一个节点值满足题意的要求。

解题代码

c/c++
#include 

class Solution
{
public:
    int uniquePaths(int m, int n)
    {
        std::vector<int> dp(n, 1);

        for (int i = 0; i < m - 1; i++)
        {
            for (int j = 1; j < n; j++)
            {
                dp[j] = dp[j] + dp[j - 1];
            }
        }

        return dp[n - 1];
    }
};
golang
func uniquePaths(m int, n int) int {
	dp := make([]int, n)
	for i := 0; i < n; i++ {
		dp[i] = 1
	}

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

	return dp[n-1]
}
lua
local function uniquePaths(m, n)
    local dp = {}
    for i = 1, n do
        dp[i] = 1
    end

    for i = 1, m - 1 do
        for j = 2, n do
            dp[j] = dp[j] + dp[j - 1]
        end
    end

    return dp[n]
end

撒花!

如果本文对你有帮助,就点关注或者留个
如果您有任何技术问题或者需要更多其他的内容,请随时向我提问。

在这里插入图片描述

你可能感兴趣的:(算法每日一练,算法,数据结构)