a처음에는 재귀를 이용한 완전 탐색으로 접근했다.
/**
* @param {number[]} nums
* @return {number}
*/
const jump = function(nums) {
const endIndex = nums.length - 1
let ans = Infinity
function travel(position, count) {
if (position > endIndex) {
return
}
if (position === endIndex) {
ans = Math.min(ans, count)
return
}
const jumpRange = nums[position]
for (let i = 1; i <= jumpRange; i++) {
travel(position + i, count + 1)
}
}
travel(0, 0)
return ans
};
시간 복잡도를 줄이기 위해 배열을 하나 선언했고, 그 배열을 업데이트하면서 재귀를 개선하였다. (메모이제이션)
const jump = function(nums) {
const memo = Array(nums.length).fill(0);
let min = Infinity
function run(idx) {
if (idx >= nums.length - 1) return 0
if (memo[idx]) return memo[idx]
for (let i = idx + 1; i <= idx + nums[idx]; i++) {
min = Math.min(min, run(i) + 1)
}
memo[idx] = min
return min
}
console.log(memo)
return run(0)
};
마지막으로, dp로도 가능하다.
const jump = function(nums) {
const dp = new Array(nums.length).fill(Infinity);
dp[0] = 0;
for (let i = 0; i < nums.length; i++) {
const maxJump = Math.min(i + nums[i], nums.length - 1);
for (let j = i + 1; j <= maxJump; j++) {
dp[j] = Math.min(dp[j], dp[i] + 1);
}
}
return dp[nums.length - 1];
};
'알고리즘 > 리트코드' 카테고리의 다른 글
LeetCode 787. Cheapest Flights Within K Stops (0) | 2023.01.26 |
---|---|
LeetCode 93. Restore IP Addresses (0) | 2023.01.21 |
43. Multiply Strings (0) | 2022.09.12 |
139. Word Break (0) | 2022.05.08 |
54. Spiral Matrix (0) | 2022.04.30 |