Next Greater Element Using Stack in DSA Python - Time & Space Complexity
We want to understand how the time needed changes when we find the next greater element for each item in a list using a stack.
How does the number of steps grow as the list gets bigger?
Analyze the time complexity of the following code snippet.
def next_greater_element(arr):
stack = []
result = [-1] * len(arr)
for i, value in enumerate(arr):
while stack and arr[stack[-1]] < value:
index = stack.pop()
result[index] = value
stack.append(i)
return result
This code finds the next greater number for each element in the list using a stack to keep track of indices.
- Primary operation: The for-loop goes through each element once, and the while-loop pops elements from the stack when the current element is greater.
- How many times: Each element is pushed and popped at most once, so the total number of stack operations is at most 2n.
As the list size grows, each element is handled a limited number of times.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 stack operations |
| 100 | About 200 stack operations |
| 1000 | About 2000 stack operations |
Pattern observation: The operations grow roughly in a straight line with the input size.
Time Complexity: O(n)
This means the time needed grows directly in proportion to the number of elements in the list.
[X] Wrong: "The nested while-loop makes this algorithm O(n²) because it looks like a loop inside a loop."
[OK] Correct: Each element is pushed and popped only once, so the total work inside the while-loop across the whole run is limited to n operations, not n².
Understanding this pattern helps you solve many problems efficiently by using stacks to track previous elements, a skill often valued in coding challenges.
What if we changed the input to a linked list instead of an array? How would the time complexity change?
Practice
Solution
Step 1: Understand the problem goal
The Next Greater Element problem asks to find, for each element, the first element to its right that is greater than it.Step 2: Recognize the stack usage
A stack helps efficiently track elements waiting for their next greater element to appear on the right.Final Answer:
The first greater element to the right of each element -> Option BQuick Check:
Next Greater Element = first bigger right element [OK]
- Confusing next greater with next smaller element
- Looking to the left instead of right
- Thinking it finds the largest element overall
Solution
Step 1: Identify stack data structure in Python
In Python, a list is commonly used as a stack because it supports append() and pop() operations.Step 2: Check initialization syntax
An empty list is created with square brackets []. Curly braces {} create a dictionary, parentheses () create a tuple, and None is a null value.Final Answer:
stack = [] -> Option AQuick Check:
Empty stack = empty list [] [OK]
- Using {} which creates a dictionary
- Using () which creates a tuple
- Assigning None instead of a list
[4, 5, 2, 25]?Solution
Step 1: Find next greater for each element
For 4, next greater is 5; for 5, next greater is 25; for 2, next greater is 25; for 25, no greater element, so -1.Step 2: Write the output array
The output array is [5, 25, 25, -1].Final Answer:
[5, 25, 25, -1] -> Option CQuick Check:
Check each element's next bigger right = output [OK]
- Putting -1 too early for elements that have bigger right
- Confusing order of output elements
- Missing last element's -1
def next_greater(arr):
stack = []
result = [-1] * len(arr)
for i in range(len(arr)):
while stack and arr[stack[-1]] < arr[i]:
result[stack.pop()] = arr[i]
stack.append(i)
return result
print(next_greater([2, 7, 3, 5, 4, 6, 8]))Solution
Step 1: Analyze the code logic
The code uses a stack to store indices and updates the result list with next greater elements correctly.Step 2: Check for syntax and runtime errors
All syntax is correct, stack usage is proper, and list initialization is valid.Final Answer:
No error, code runs correctly -> Option AQuick Check:
Stack and result used correctly, no errors [OK]
- Assuming index errors without checking stack conditions
- Confusing syntax errors with logic errors
- Misreading list initialization syntax
[13, 7, 6, 12]. Using the Next Greater Element approach with a stack, what will be the final output array?Solution
Step 1: Find next greater element for each index
For 13, no greater element to right, so -1; for 7, next greater is 12; for 6, next greater is 12; for 12, no greater element, so -1.Step 2: Write the output array
The output is [-1, 12, 12, -1].Final Answer:
[-1, 12, 12, -1] -> Option DQuick Check:
Check each element's next bigger right = output [OK]
- Assuming first element has a bigger next element incorrectly
- Mixing values with indices in output
- Forgetting to put -1 when no greater element exists
Ready to prove it?
Pass the test and this pattern moves unknown
