|
1 | 1 | // #Medium #Top_100_Liked_Questions #Array #Dynamic_Programming #Greedy |
2 | 2 | // #Algorithm_II_Day_13_Dynamic_Programming #Dynamic_Programming_I_Day_4 |
3 | 3 | // #Top_Interview_150_Array/String #Big_O_Time_O(n)_Space_O(1) |
4 | | -// #2023_09_30_Time_50_ms_(95.93%)_Space_44.9_MB_(65.88%) |
| 4 | +// #2025_03_23_Time_1_ms_(84.27%)_Space_58.46_MB_(28.93%) |
5 | 5 |
|
6 | | -function jump(nums: number[]): number { //NOSONAR |
7 | | - let minJmp = new Array(nums.length) |
8 | | - if (nums.length === 1) return 0 |
9 | | - let prevIndex = 0 |
10 | | - minJmp[prevIndex] = 0 |
11 | | - while (prevIndex < nums.length - 1) { |
12 | | - let nextMaxJmpTo = nums[prevIndex] + prevIndex |
13 | | - let prevIndexJmp = minJmp[prevIndex] |
| 6 | +function jump(nums: number[]): number { |
| 7 | + let minJump = 0, |
| 8 | + farthest = 0, |
| 9 | + currentEnd = 0 |
| 10 | + for (let i = 0; i < nums.length - 1; i++) { |
| 11 | + farthest = Math.max(farthest, i + nums[i]) |
| 12 | + // If we've reached the end of the current jump range |
| 13 | + if (i === currentEnd) { |
| 14 | + minJump++ |
| 15 | + currentEnd = farthest |
14 | 16 |
|
15 | | - let farthestJumpVal = -1 |
16 | | - let farthestJumpIndex = -1 |
17 | | - for (let i = nextMaxJmpTo; ; i--) { |
18 | | - if (i >= nums.length) { |
19 | | - continue |
20 | | - } |
21 | | - if (i === nums.length - 1) { |
22 | | - return prevIndexJmp + 1 |
23 | | - } |
24 | | - if (minJmp[i] != undefined) { |
25 | | - break |
26 | | - } |
27 | | - minJmp[i] = prevIndexJmp + 1 |
28 | | - let curmaxTo = nums[i] + i |
29 | | - if (farthestJumpVal < curmaxTo) { |
30 | | - farthestJumpVal = curmaxTo |
31 | | - farthestJumpIndex = i |
32 | | - } |
| 17 | + if (currentEnd >= nums.length - 1) break |
33 | 18 | } |
34 | | - if (farthestJumpIndex === -1) { |
35 | | - return -1 |
36 | | - } |
37 | | - prevIndex = farthestJumpIndex |
38 | 19 | } |
39 | | - return minJmp[nums.length - 1] |
| 20 | + return minJump |
40 | 21 | } |
41 | 22 |
|
42 | 23 | export { jump } |
0 commit comments