Leetcode前端必会系列:不同路径

57 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

引言

算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。

题目描述

一个机器人位于一个 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

分析

根据题目的分析,我们如何设计求不同的路径?根据题目的描述,我们可以使用动态规划进行路径的个数保存

  1. 初始化边界第一行和第一列的数目是1
  2. 从第二个还是遍历,每个位置的路径都是上边和左边的和
  3. 遍历到最右边角落的位置,就目标的结果。
  4. 返回结果。

解答

/**

 * @param {number} m

 * @param {number} n

 * @return {number}

 */

var uniquePaths = function(m, n) {

   let arr = Array.from(new Array(m),(item)=>new Array(n).fill(0))

  arr[0][0] = 1

  for(let i=0;i<m;i++) {

    arr[i][0] = 1

  }

  for(let i=0;i<n;i++) {

    arr[0][i] = 1

  }

  for(let i=1;i<m;i++) {

    for(let j=1;j<n;j++){

      arr[i][j] = arr[i-1][j] + arr[i][j-1]

    }

  }

  return arr[m-1][n-1]

};

不同路径的解题思路整体还是比较容易的,按照规律进行设计就可以

总结

不同路径的是基于动态规划的设计方案,整体设计计较简单。