There is a robot on an m x n grid.
The robot is initially located at the top-left corner (i.e., grid[0][0]).
The robot tries to move to the bottom-right corner (i.e., grid[m – 1][n – 1]).
The robot can only move either down or right at any point in time.
Given the two integers m and n, return the number of possible unique paths that the robot can take to reach the bottom-right corner.
The test cases are generated so that the answer will be less than or equal to 2 * 109.
這裡有一個機器人在 m x n 的方格。 機器人最初的位置在左上方的角落(ex. grid[0][0]) 機器人嘗試移動到右下方的角落(ex. grid[m - 1][n - 1]。 機器人一次只可以移動「下」或「右」到任何點。 給予兩個整數 m 和 n,讓機器人可以開始搜尋到右下角,回傳可能到達路徑的次數。 測試的案例中,答案小於等於 2 * 109。
Example 1:

Input: m = 3, n = 7 Output: 28
Example 2:
Input: m = 3, n = 2 Output: 3 Explanation: From the top-left corner, there are a total of 3 ways to reach the bottom-right corner: 1. Right -> Down -> Down 2. Down -> Down -> Right 3. Down -> Right -> Down
Solution:
1. 宣告存放數值的陣列。(ex. [[0, 0, 0],[0, 0, 0]]
2. 放入 i 跟 j 代表起點格子,直到終點 m 跟 n。
+------+ +------+ | 1, 1 | => | m, n | +------+ +------+
3. 預設起點步數符合為 1。
4. 不符,則從終點依序 temp[i – 1][j] 與 temp[i][j – 1] 回到起點。
5. 將過程中的符合 m 與 n 的範圍進行加總。
Code.1: Method of exhaustion 窮舉
var uniquePaths = function(m, n) {
const searchPath = (m, n, row, column) => {
if (row === m && column === n) return 1
if (row > m || column > n) return 0
return searchPath(m, n, row, column + 1) + searchPath(m, n, row + 1, column)
}
return searchPath(m, n, 1, 1)
};
section.1
m = 3, n = 2 => m x 2 = 3 x 2 grid
一Start一
+------+------+
| 1, 1 | 1, 2 |
+------+------+
| 2, 1 | 2, 2 |
+------+------+
| 3, 1 | 3, 2 |
+------+------+
一End一
section.2
m = 3, n = 2, r = row, c = column
(r, c)
|-------------(1, 1)-----------------|
|---(1, 2)---| |------(2, 1)------|
(1, 3) |---(2, 2)---| |---(2, 2)---| |---(3, 1)---|
0 (2, 3) (3, 2) (2, 3) (3, 2) (3, 2) (4, 1)
0 1 0 1 1 0
每一次的路徑選擇分為「右邊 + 1」或「左邊 + 1」,
當 row > m(3) 時為 0,而 column > n(2) 時為 0,
且剛好 row === m,與 column === n」的時候,回傳 1,
最後加總所有的 1。
Code.2: Method of Recursion and Hashmap 遞迴和散列圖
var uniquePaths = function(m, n) {
let temp = {}
const searchPath = function(m, n, temp) {
if (m === 1|| n === 1) return 1
temp[`${m}-${n}`] = searchPath(m - 1, n, temp) + searchPath(m, n - 1, temp)
console.log(temp)
return temp[`${m}-${n}`]
}
return searchPath(m, n, temp)
};
section.1
m = 3, n = 2 => m x 2 = 3 x 2 grid
一End一
+------+------+
| 1, 1 | 1, 2 |
+------+------+
| 2, 1 | 2, 2 |
+------+------+
| 3, 1 | 3, 2 |
+------+------+
一Start一
section.2
m = 3, n = 2, r = row, c = column
(m, 2)
|-------------(3, 2)-------------------|
|------(2, 2)------| |------(3, 1)---|
|---(1, 2)---| |---(2, 1)---| |---(2, 1)---| (3, 0)
(0, 2) (1, 1) (1, 1) (2, 0) (1, 1) (2, 0) 0
0 1 1 0 1 0
Code.3: Method of Dynamic Programming 動態規劃
var uniquePaths = function(m, n) {
let temp = new Array(m + 1).fill(1).map(x => new Array(n + 1).fill(0));
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
if (i === 1 && j === 1) {
temp[i][j] = 1
} else {
temp[i][j] = temp[i - 1][j] + temp[i][j - 1]
}
}
}
return temp[m][n]
}
FlowChart:
Example 1: Method of Dynamic Programming 動態規劃
Input: m = 3, n = 7 -m: 0~3
------------------------+
temp = [[ 0, 0, 0, 0, | 0
0, 0, 0, 0 ], |
[ 0, 0, 0, 0, | 1
0, 0, 0, 0 ], |
[ 0, 0, 0, 0, | 2
0, 0, 0, 0 ], |
[ 0, 0, 0, 0, | 3
0, 0, 0, 0 ]] |
------------------------+
-n: 0~7 ( 0, 1, 2, 3,
4, 5, 6, 7 )
step.1
i = 1, j = 1
Array[1][1] = 1
:
temp = [[ 0, 1, 0, 0, -m: 1
0, 0, 0, 0 ],
:
i = 1, j = 2
Array[1][2] = Array[0][2] + Array[1][1] => 0 + 1 = 1
:
temp = [[ 0, 1, 1, 0, -m: 1
0, 0, 0, 0 ],
:
i = 1, j = 3
Array[1][3] = Array[0][3] + Array[1][2] => 0 + 1 = 1
:
temp = [[ 0, 1, 1, 1, -m: 1
0, 0, 0, 0 ],
:
i = 1, j = 4
Array[1][4] = Array[0][4] + Array[1][3] => 0 + 1 = 1
:
temp = [[ 0, 1, 1, 1, -m: 1
1, 0, 0, 0 ],
:
i = 1, j = 5
Array[1][5] = Array[0][5] + Array[1][4] => 0 + 1 = 1
:
temp = [[ 0, 1, 1, 1, -m: 1
1, 1, 0, 0 ],
:
i = 1, j = 6
Array[1][6] = Array[0][6] + Array[1][5] => 0 + 1 = 1
:
temp = [[ 0, 1, 1, 1, -m: 1
1, 1, 1, 0 ],
:
i = 1, j = 7
Array[1][7] = Array[0][7] + Array[1][6] => 0 + 1 = 1
:
temp = [[ 0, 1, 1, 1, -m: 1
1, 1, 1, 1 ],
:
round.1
------------------------+
temp = [[ 0, 0, 0, 0, |
0, 0, 0, 0 ], |
[ 0, 1, 1, 1, |
1, 1, 1, 1 ], |
[ 0, 0, 0, 0, |
0, 0, 0, 0 ], |
[ 0, 0, 0, 0, |
0, 0, 0, 0 ]] |
------------------------+
step.2
i = 2, j = 1
Array[2][1] = Array[1][1] + Array[2][0] => 1 + 0 = 1
:
temp = [[ 0, 1, 0, 0, -m: 2
0, 0, 0, 0 ],
:
i = 2, j = 2
Array[2][2] = Array[1][2] + Array[2][1] => 1 + 1 = 2
:
temp = [[ 0, 1, 2, 0, -m: 2
0, 0, 0, 0 ],
:
i = 2, j = 3
Array[2][3] = Array[1][3] + Array[2][2] => 1 + 2 = 3
:
temp = [[ 0, 1, 2, 3, -m: 2
0, 0, 0, 0 ],
:
i = 2, j = 4
Array[2][4] = Array[1][4] + Array[2][3] => 1 + 3 = 4
:
temp = [[ 0, 1, 2, 3, -m: 2
4, 0, 0, 0 ],
:
i = 2, j = 5
Array[2][5] = Array[1][5] + Array[2][4] => 1 + 4 = 5
:
temp = [[ 0, 1, 2, 3, -m: 2
4, 5, 0, 0 ],
:
i = 2, j = 6
Array[2][6] = Array[1][6] + Array[2][5] => 1 + 5 = 6
:
temp = [[ 0, 1, 2, 3, -m: 2
4, 5, 6, 0 ],
:
i = 2, j = 7
Array[2][7] = Array[1][7] + Array[2][6] => 1 + 6 = 7
:
temp = [[ 0, 1, 2, 3, -m: 2
4, 5, 6, 7 ],
:
round.2
------------------------+
temp = [[ 0, 0, 0, 0, |
0, 0, 0, 0 ], |
[ 0, 1, 1, 1, |
1, 1, 1, 1 ], |
[ 0, 1, 2, 3, |
4, 5, 6, 7 ], |
[ 0, 0, 0, 0, |
0, 0, 0, 0 ]] |
------------------------+
step.3
i = 3, j = 1
Array[3][1] = Array[2][1] + Array[3][0] => 1 + 0 = 1
:
temp = [[ 0, 1, 0, 0, -m: 3
0, 0, 0, 0 ],
:
i = 3, j = 2
Array[3][2] = Array[2][2] + Array[3][1] => 2 + 1 = 3
:
temp = [[ 0, 1, 3, 0, -m: 3
0, 0, 0, 0 ],
:
i = 3, j = 3
Array[3][3] = Array[2][3] + Array[3][2] => 3 + 3 = 6
:
temp = [[ 0, 1, 3, 6, -m: 3
0, 0, 0, 0 ],
:
i = 3, j = 4
Array[3][4] = Array[2][4] + Array[3][3] => 4 + 6 = 10
:
temp = [[ 0, 1, 3, 6, -m: 3
10, 0, 0, 0 ],
:
i = 3, j = 5
Array[3][5] = Array[2][5] + Array[3][4] => 5 + 10 = 15
:
temp = [[ 0, 1, 3, 5, -m: 3
10, 15, 0, 0 ],
:
i = 3, j = 6
Array[3][6] = Array[2][6] + Array[3][5] => 6 + 15 = 21
:
temp = [[ 0, 1, 3, 5, -m: 3
10, 15, 21, 0 ],
:
i = 3, j = 7
Array[3][7] = Array[2][7] + Array[3][6] => 7 + 21 = 28
:
temp = [[ 0, 1, 3, 5, -m: 3
10, 15, 21, 28 ],
:
round.3
----------------------------+
temp = [[ 0, 0, 0, 0, |
0, 0, 0, 0 ], |
[ 0, 1, 1, 1, |
1, 1, 1, 1 ], |
[ 0, 1, 2, 3, |
4, 5, 6, 7 ], |
[ 0, 1, 3, 5, |
10, 15, 21, 28 ]] |
----------------------------+
Example 2: Method of Dynamic Programming 動態規劃
Input: m = 3, n = 2 --------------------------------------------+ temp = [[0,0,0], [0,0,0], [0,0,0], [0,0,0]] | --------------------------------------------+ -m: 0 1 2 3 -n: 0 1 2 step.1 i = 1, j = 1 Array[1][1] = 1 temp = [[0,0,0], [0,0,0], [0,0,0], [0,0,0]] i = 1, j = 2 temp[0][2] + temp[1][1] => 0 + 1 = 1 Array[1][2] = 1 temp = [[0,0,0], [0,1,0], [0,0,0], [0,0,0]] step.2 i = 2, j = 1 temp[1][1] + temp[2][0] => 1 + 0 = 1 Array[2][1] = 1 temp = [[0,0,0], [0,1,1], [0,0,0], [0,0,0]] i = 2, j = 2 temp[1][2] + temp[2][1] => 1 + 1 = 2 Array[2][2] = 2 temp = [[0,0,0], [0,1,1], [0,1,0], [0,0,0]] step.3 i = 3, j = 1 temp[2][1] + temp[3][0] => 1 + 0 = 1 Array[3][1] = 1 temp = [[0,0,0], [0,1,1], [0,1,2], [0,0,0]] i = 3, j = 2 temp[2, 2] + temp[3, 1] => 2 + 1 = 3 Array[3][2] = 3 temp = [[0,0,0], [0,1,1], [0,1,2], [0,1,0]] return temp[3][2] = 3
.fill()
.fill():將陣列中第一到最後的每個位置填入一個靜態的數值。 const array1 = [1, 2, 3, 4]; // fill with 0 from position 2 until position 4 console.log(array1.fill(0, 2, 4)); // expected output: [1, 2, 0, 0] // fill with 5 from position 1 console.log(array1.fill(5, 1)); // expected output: [1, 5, 5, 5] console.log(array1.fill(6)); // expected output: [6, 6, 6, 6]
.map()
.map():建立一個新的陣列,將原陣列中的每個元素透過函式運算後回傳結果。 const array1 = [1, 4, 9, 16]; // pass a function to map const map1 = array1.map(x => x * 2); console.log(map1); // expected output: Array [2, 8, 18, 32]