* 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);
};
var dfs = (row, col) => {
const left = uniquePaths(row - 1, col);
const right = uniquePaths(row, col - 1);
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,
);
};
var getMemo = (row, col) =>
new Array(row + 1)
.fill()
.map(() =>
new Array(col + 1).fill(0),
);
var dfs = (row, col, memo) => {
const left = uniquePaths(
row - 1,
col,
memo,
);
const right = uniquePaths(
row,
col - 1,
memo,
);
memo[row][col] =
left + right;
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,
);
search(row, col, tabu);
return tabu[row - 1][col - 1];
};
var search = (row, col, tabu) => {
for (let _row = 1; _row < row; _row++) {
for (let _col = 1; _col < col; _col++) {
const left = tabu[_row - 1][_col];
const right = tabu[_row][_col - 1];
tabu[_row][_col] = left + right;
}
}
};
var initTabu = (row, col) => {
const tabu = new Array(row)
.fill()
.map(() => new Array(col).fill(0));
for (let _row = 0; _row < row; _row++) {
tabu[_row][0] = 1;
}
for (let _col = 0; _col < col; _col++) {
tabu[0][_col] = 1;
}
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);
search(row, col, tabu);
return tabu[col - 1];
};
var initTabu = (col) =>
new Array(col).fill(1);
var search = (row, col, tabu) => {
for (let _row = 1; _row < row; _row++) {
for (let _col = 1; _col < col; _col++) {
const prev = tabu[_col - 1];
tabu[_col] += prev;
}
}
};