5a3c1b2d创建于 2025年8月3日历史提交
/**
 * Brute Force - DFS
 * Time O(2^N) | Space O(HEIGHT)
 * https://leetcode.com/problems/unique-paths/
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = (row, col) => {
    const isBaseCase = row == 1 || col == 1;
    if (isBaseCase) return 1;

    return dfs(row, col); /* Time O(2^N) | Space O(HEIGHT) */
};

var dfs = (row, col) => {
    const left = uniquePaths(row - 1, col); /* Time O(2^N) | Space O(HEIGHT) */
    const right = uniquePaths(row, col - 1); /* Time O(2^N) | Space O(HEIGHT) */

    return left + right;
};

/**
 * DP - Top Down
 * Matrix - Memoization
 * Time O(ROWS * COLS) | Space O(ROWS * COLS)
 * https://leetcode.com/problems/unique-paths/
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = (row, col, memo = getMemo(row, col)) => {
    const isBaseCase = row === 1 || col === 1;
    if (isBaseCase) return 1;

    const hasSeen = memo[row][col] !== 0;
    if (hasSeen) return memo[row][col];

    return dfs(
        row,
        col,
        memo,
    ); /* Time O(ROWS * COLS) | Space O((ROWS * COLS) + HEIGHT) */
};

var getMemo = (row, col) =>
    new Array(row + 1)
        .fill() /* Time O(ROWS)| Space O(ROWS) */
        .map(() =>
            new Array(col + 1).fill(0),
        ); /* Time O(COLS)| Space O(COLS) */

var dfs = (row, col, memo) => {
    const left = uniquePaths(
        row - 1,
        col,
        memo,
    ); /* Time O(ROWS * COLS) | Space O(HEIGHT) */
    const right = uniquePaths(
        row,
        col - 1,
        memo,
    ); /* Time O(ROWS * COLS) | Space O(HEIGHT) */

    memo[row][col] =
        left + right; /*                     | Space O(ROWS * COLS) */
    return memo[row][col];
};

/**
 * DP - Bottom Up
 * Matrix - Tabulation
 * Time O(ROWS * COLS) | Space O(ROWS * COLS)
 * https://leetcode.com/problems/unique-paths/
 * @param {number} row
 * @param {number} col
 * @return {number}
 */
var uniquePaths = (row, col) => {
    const tabu = initTabu(
        row,
        col,
    ); /* Time O(ROWS * COLS) | Space O(ROWS * COLS) */

    search(row, col, tabu); /* Time O(ROWS * COLS) | Space O(ROWS * COLS) */

    return tabu[row - 1][col - 1];
};

var search = (row, col, tabu) => {
    for (let _row = 1; _row < row; _row++) {
        /* Time O(ROWS)*/
        for (let _col = 1; _col < col; _col++) {
            /* Time O(COLS)*/
            const left = tabu[_row - 1][_col];
            const right = tabu[_row][_col - 1];

            tabu[_row][_col] = left + right; /* Space O(ROWS * COLS) */
        }
    }
};

var initTabu = (row, col) => {
    const tabu = new Array(row)
        .fill() /* Time O(ROWS)     | Space O(ROWS) */
        .map(() => new Array(col).fill(0)); /* Time O(COLS) | Space O(COLS) */

    for (let _row = 0; _row < row; _row++) {
        /* Time O(ROWS) */
        tabu[_row][0] = 1; /*              | Space O(ROWS * COLS) */
    }

    for (let _col = 0; _col < col; _col++) {
        /* Time O(COLS) */
        tabu[0][_col] = 1; /*              | Space O(ROWS * COLS) */
    }

    return tabu;
};

/**
 * DP - Bottom Up
 * Array - Tabulation
 * Time O(ROWS * COLS) | Space O(COLS)
 * https://leetcode.com/problems/unique-paths/
 * @param {number} m
 * @param {number} n
 * @return {number}
 */
var uniquePaths = (row, col) => {
    const tabu = initTabu(col); /* Time O(COLS)        | Space O(COLS) */

    search(row, col, tabu); /* Time O(ROWS * COLS) | Space O(COLS) */

    return tabu[col - 1];
};

var initTabu = (col) =>
    new Array(col).fill(1); /* Time O(COLS) | Space O(COLS) */

var search = (row, col, tabu) => {
    for (let _row = 1; _row < row; _row++) {
        /* Time O(ROWS) */
        for (let _col = 1; _col < col; _col++) {
            /* Time O(COLS) */
            const prev = tabu[_col - 1];

            tabu[_col] += prev; /* Space O(COLS) */
        }
    }
};