Jump Game Problem in DSA Go - Time & Space Complexity
We want to understand how the time needed to solve the Jump Game problem changes as the input size grows.
Specifically, how the number of steps to check jumps grows with the length of the input array.
Analyze the time complexity of the following code snippet.
func canJump(nums []int) bool {
maxReach := 0
for i := 0; i < len(nums); i++ {
if i > maxReach {
return false
}
if i+nums[i] > maxReach {
maxReach = i + nums[i]
}
}
return true
}
This code checks if you can jump from the start to the end of the array, where each number shows the max jump length from that position.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: A single loop that goes through each position in the array once.
- How many times: The loop runs exactly once for each element, so n times if the array length is n.
As the array gets longer, the number of steps grows directly with its length.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: The work grows in a straight line with input size; doubling the input doubles the work.
Time Complexity: O(n)
This means the time to decide if you can reach the end grows linearly with the number of positions.
[X] Wrong: "Because we check jumps from each position, the time must be much bigger, like O(n²)."
[OK] Correct: The code only loops once through the array and updates the farthest reachable position without nested loops, so it stays linear.
Understanding this linear time solution shows you can find efficient ways to solve problems that might seem complex at first.
"What if we changed the code to try all possible jumps from each position instead of just tracking the farthest reach? How would the time complexity change?"
Practice
Solution
Step 1: Understand the problem statement
The Jump Game problem asks if you can move from the first index to the last index by jumping forward within the allowed steps at each position.Step 2: Identify the key question
The key question is whether the last index is reachable, not how many jumps or maximum jump length.Final Answer:
If you can reach the last index starting from the first index by jumping within allowed steps -> Option AQuick Check:
Jump Game = Reach last index? [OK]
- Confusing reachability with minimum jumps
- Thinking about maximum jump length instead
- Assuming sum of jumps matters
Solution
Step 1: Recall Go slice declaration syntax
In Go, slices are declared with []type and curly braces for values, e.g., []int{...}.Step 2: Check each option
Only jumps := []int{2, 3, 1, 1, 4} uses correct slice syntax. The others use array syntax, invalid int{}, or parentheses.Final Answer:
jumps := []int{2, 3, 1, 1, 4} -> Option DQuick Check:
Slice declaration = []int{values} [OK]
- Using square brackets without type for slices
- Using parentheses instead of braces
- Confusing arrays and slices syntax
package main
import "fmt"
func canJump(nums []int) bool {
maxReach := 0
for i := 0; i < len(nums); i++ {
if i > maxReach {
return false
}
if i+nums[i] > maxReach {
maxReach = i + nums[i]
}
}
return true
}
func main() {
nums := []int{2, 3, 1, 1, 4}
fmt.Println(canJump(nums))
}Solution
Step 1: Trace maxReach updates
Start maxReach=0. At i=0, maxReach=max(0,0+2)=2. i=1 ≤ 2, maxReach=max(2,1+3)=4. i=2 ≤ 4, maxReach=max(4,2+1)=4. i=3 ≤ 4, maxReach=max(4,3+1)=4. i=4 ≤ 4, maxReach=max(4,4+4)=8.Step 2: Check if any index is unreachable
All i ≤ maxReach, so no false return. Loop ends, returns true.Final Answer:
true -> Option AQuick Check:
All indices reachable = true [OK]
- Not updating maxReach correctly
- Returning false too early
- Ignoring the condition i > maxReach
func canJump(nums []int) bool {
maxReach := 0
for i := 0; i <= len(nums); i++ {
if i > maxReach {
return false
}
if i+nums[i] > maxReach {
maxReach = i + nums[i]
}
}
return true
}Solution
Step 1: Analyze loop boundary
The loop runs with i <= len(nums), which causes index out of range error at i == len(nums).Step 2: Fix loop condition
Changing to i < len(nums) prevents out of range access and fixes the bug.Final Answer:
Change loop condition to i < len(nums) -> Option CQuick Check:
Loop index must be less than slice length [OK]
- Using <= instead of < in loop condition
- Ignoring runtime panic from out of range
- Changing unrelated parts of code
nums := []int{3, 2, 1, 0, 4}, what is the result of applying the Jump Game algorithm to check if the last index is reachable?Solution
Step 1: Trace maxReach through the array
Start maxReach=0. i=0: maxReach=max(0,0+3)=3. i=1 ≤ 3: maxReach=max(3,1+2)=3. i=2 ≤ 3: maxReach=max(3,2+1)=3. i=3 ≤ 3: maxReach=max(3,3+0)=3. i=4 > 3, so return false.Step 2: Understand why last index is unreachable
At index 3, jump length is 0, so maxReach does not increase. Index 4 is beyond maxReach, unreachable.Final Answer:
false -> Option BQuick Check:
Zero jump blocks progress = false [OK]
- Assuming zero jump can be bypassed
- Ignoring unreachable last index
- Thinking runtime error occurs
Ready to prove it?
Pass the test and this pattern moves unknown
