【LeetCode精选TOP面试题】62-不同路径

2022/03/15 15:06:54

一个机器人位于一个 m x n  网格的左上角,m 为 y 轴长度,n 为 x 轴长度。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角。

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

回溯解法

思路

找出所有走法,到达终点记作一次有效路径。

只能向右或向下。

每一步的坐标记作 [x,y],到达终点 [n,m] 的路径记作一次有效路径。

x > n || y > m 表示超出地图范围,是无效路径。

fn(x,y) 表示走到 [x,y],下一步可走的位置为:[x+1, y+1]

复杂度

  • 空间复杂度:O(1)。

代码

var uniquePaths = function (m, n) {
  let count = 0;

  function pos(x, y) {
    if (x === n && y === m) {
      count++;
      return;
    }
    if (x < n) {
      pos(x + 1, y);
    }

    if (y < m) {
      pos(x, y + 1);
    }
  }
  pos(1, 1);
  return count;
};
let result = uniquePaths(3, 2);
console.log(result);

动态规划解法

代码 1

f(x, y) 表示走到 (x, y) 的路径数。

要走到 (x, y) 必须走到 (x - 1, y)(x, y - 1)

动态规划方程:f(x, y) = f(x - 1, y) + f(x, y - 1)

1 * 1 的空间只有一条路,即 f(1, 1) = 1

var uniquePaths = function (m, n) {
  if (m === 0 || n === 0) {
    return 0;
  }
  if (m === 1 && n === 1) {
    return 1;
  }
  return uniquePaths(m - 1, n) + uniquePaths(m, n - 1);
};

let result = uniquePaths(3, 2);
console.log(result);

代码 2

复杂度

  • 时间复杂度:O(mn)
  • 空间复杂度:O(mn)
var uniquePaths = function (m, n) {
  let f = new Array(m).fill(new Array(n).fill(0));

  // 到达边界上的某点只有一条路径
  for (let i = 1; i < m; i++) {
    f[0][i] = 1;
  }

  for (let j = 1; j < n; j++) {
    f[j][0] = 1;
  }

  for (let mi = 1; mi < m; mi++) {
    for (let ni = 1; ni < n; ni++) {
      f[mi][ni] = f[mi - 1][ni] + f[mi][ni - 1];
    }
  }
  return f[m - 1][n - 1];
};