Jump Game Problem in DSA C++ - 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 does the number of steps to check jumps grow with the length of the array?
Analyze the time complexity of the following code snippet.
bool canJump(std::vector<int>& nums) {
int reachable = 0;
for (int i = 0; i < nums.size(); i++) {
if (i > reachable) return false;
reachable = std::max(reachable, i + nums[i]);
}
return true;
}
This code checks if you can jump from the start to the end of the array, where each number tells the max jump length from that position.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: A single loop that goes through each element of the array once.
- How many times: Exactly once for each element, so n times if the array length is n.
As the array gets longer, the code checks each position once to update the farthest reachable index.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 10 checks |
| 100 | About 100 checks |
| 1000 | About 1000 checks |
Pattern observation: The number of operations grows directly with the input size, so doubling the input roughly doubles the work.
Time Complexity: O(n)
This means the time to decide if you can reach the end grows linearly with the size of the input array.
[X] Wrong: "Because we check jumps from each position, the time is quadratic O(n²)."
[OK] Correct: The code only loops once through the array and updates the farthest reachable index without nested loops, so it does not repeat work for each jump.
Understanding this linear time solution shows you can analyze and optimize problems that look like they might need more work, which is a great skill for interviews.
"What if we changed the code to try every possible jump from each position instead of just tracking the farthest reachable? How would the time complexity change?"
Practice
Jump Game problem?Solution
Step 1: Understand the problem statement
The Jump Game problem asks if it is possible to move from the first position of an array to the last position by jumping forward. Each array element represents the maximum jump length from that position.Step 2: Identify the goal
The goal is to check if the last index can be reached starting from the first index using the allowed jumps.Final Answer:
Determine if you can reach the last index from the first index by jumping -> Option DQuick Check:
Jump Game goal = Reach last index [OK]
- Confusing maximum jump length with total jumps
- Trying to count jumps instead of checking reachability
- Assuming jumps can be backward
nums initialized with values {2,3,1,1,4}?Solution
Step 1: Understand vector declaration syntax
In C++, to declare a vector of integers with initial values, usestd::vector<int> nums = {values};.Step 2: Check each option
std::vector<int> nums = {2,3,1,1,4}; uses correct syntax with type and initializer list. Options A and C miss template type or use wrong brackets. std::vector<int> nums(2,3,1,1,4); uses constructor incorrectly.Final Answer:
std::vector<int> nums = {2,3,1,1,4}; -> Option CQuick Check:
Correct vector initialization syntax = std::vector<int> nums = {2,3,1,1,4}; [OK]
- Omitting <int> in vector declaration
- Using square brackets [] instead of curly braces {}
- Incorrect constructor parameters
std::vector<int> nums = {2,3,1,1,4};
int maxReach = 0;
for (int i = 0; i <= maxReach; ++i) {
maxReach = std::max(maxReach, i + nums[i]);
if (maxReach >= nums.size() - 1) {
std::cout << "true" << std::endl;
break;
}
}
if (maxReach < nums.size() - 1) std::cout << "false" << std::endl;Solution
Step 1: Trace the loop and maxReach updates
Start with maxReach=0. At i=0, maxReach = max(0, 0+2) = 2. At i=1, maxReach = max(2, 1+3) = 4. Since maxReach (4) >= last index (4), print "true" and break.Step 2: Confirm output
The loop breaks after printing "true". No further output.Final Answer:
true -> Option BQuick Check:
maxReach reaches last index, output = true [OK]
- Not updating maxReach correctly
- Missing break causing extra output
- Confusing index bounds in loop
bool canJump(std::vector<int>& nums) {
int maxReach = 0;
for (int i = 0; i < nums.size(); ++i) {
if (i > maxReach) return false;
maxReach = std::max(maxReach, i + nums[i]);
}
return true;
}Solution
Step 1: Analyze loop and conditions
The loop iterates over all indices. If current index i is beyond maxReach, return false immediately. Otherwise, update maxReach.Step 2: Verify correctness
This logic correctly checks if the last index is reachable. Returning false inside loop is valid. maxReach update is correct.Final Answer:
No error, code works correctly -> Option AQuick Check:
Code logic matches Jump Game solution [OK]
- Changing loop condition incorrectly
- Moving return false outside loop causing wrong result
- Incorrect maxReach calculation
nums = {3,2,1,0,4}, why does the standard greedy Jump Game algorithm return false?Solution
Step 1: Understand the array and jumps
Starting at index 0 with jump length 3, you can reach indices 1, 2, or 3. At index 3, jump length is 0, so you cannot move forward from there.Step 2: Identify why last index is unreachable
Since index 4 is beyond index 3 and no jumps can be made from index 3, the last index cannot be reached, so the algorithm returns false.Final Answer:
Because the zero at index 3 blocks any further jumps to the last index -> Option AQuick Check:
Zero jump blocks path, output = false [OK]
- Ignoring zero jump blocking
- Assuming array length affects result
- Misunderstanding jump lengths
Ready to prove it?
Pass the test and this pattern moves unknown
