← All patterns
Stack

Monotonic Stack

167 practice questions|Medium

When to use it

Keep values inside a stack in strict ascending or descending order to fetch nearest greater/smaller items.

Key Signals & Indicators

  • Need to search for the next greater or smaller element in one direction
  • Range bounds calculation, or histograms values comparisons
  • Avoids nested O(n^2) loops by pruning states linearly in O(n)

Pattern Boilerplate

c++
// C++ Next Greater Element Monotonic Stack Template
#include <vector>
#include <stack>

std::vector<int> nextGreaterElement(const std::vector<int>& arr) {
    std::vector<int> result(arr.size(), -1);
    std::stack<int> s; // Stack holds indices
    
    for (int i = 0; i < arr.size(); ++i) {
        // Maintain monotonic decreasing stack
        while (!s.empty() && arr[i] > arr[s.top()]) {
            result[s.top()] = arr[i]; // Next greater element found
            s.pop();
        }
        s.push(i);
    }
    return result;
}

Problems using this pattern

1132 PatternMedium
ArrayBinary SearchStack
Solve →
2Add Two Numbers IIMedium
Linked ListMathStack
Solve →
3Apply Operations to Maximize ScoreHard
ArrayMathStack
Solve →
4Asteroid CollisionMedium
ArrayStackSimulation
Solve →
5Backspace String CompareEasy
Two PointersStringStack
Solve →
6Baseball GameEasy
ArrayStackSimulation
Solve →
7Basic Calculator IIMedium
MathStringStack
Solve →
8Basic Calculator IIIHard
MathStringStack
Solve →
9Basic Calculator IVHard
Hash TableMathString
Solve →
10Basic CalculatorHard
MathStringStack
Solve →
11Beautiful Towers IMedium
ArrayStackMonotonic Stack
Solve →
12Beautiful Towers IIMedium
ArrayStackMonotonic Stack
Solve →
13Binary Search Tree Iterator IIMedium
StackTreeDesign
Solve →
14Binary Search Tree IteratorMedium
StackTreeDesign
Solve →
15Binary Searchable Numbers in an Unsorted ArrayMedium
ArrayBinary SearchStack
Solve →
16Binary Tree Inorder TraversalEasy
StackTreeDepth-First Search
Solve →
17Binary Tree Postorder TraversalEasy
StackTreeDepth-First Search
Solve →
18Binary Tree Preorder TraversalEasy
StackTreeDepth-First Search
Solve →
19Brace Expansion IIHard
Hash TableStringBacktracking
Solve →
20Brace ExpansionMedium
StringBacktrackingStack
Solve →
21Build an Array With Stack OperationsMedium
ArrayStackSimulation
Solve →
22Build Binary Expression Tree From Infix ExpressionHard
StringStackTree
Solve →
23Buildings With an Ocean ViewMedium
ArrayStackMonotonic Stack
Solve →
24Car Fleet IIHard
ArrayMathStack
Solve →
25Car FleetMedium
ArrayStackSorting
Solve →
26Check if a Parentheses String Can Be ValidMedium
StringStackGreedy
Solve →
27Check If Word Is Valid After SubstitutionsMedium
StringStack
Solve →
28Clear DigitsEasy
StringStackSimulation
Solve →
29Closest Binary Search Tree Value IIHard
Two PointersStackTree
Solve →
30Clumsy FactorialMedium
MathStackSimulation
Solve →
31Construct Binary Search Tree from Preorder TraversalMedium
ArrayStackTree
Solve →
32Construct Binary Tree from StringMedium
StringStackTree
Solve →
33Construct Smallest Number From DI StringMedium
StringBacktrackingStack
Solve →
34Convert Binary Search Tree to Sorted Doubly Linked ListMedium
Linked ListStackTree
Solve →
35Count Bowl SubarraysMedium
ArrayStackMonotonic Stack
Solve →
36Count Collisions on a RoadMedium
StringStackSimulation
Solve →
37Count Non-Decreasing Subarrays After K OperationsHard
ArrayStackSegment Tree
Solve →
38Count Submatrices With All OnesMedium
ArrayDynamic ProgrammingStack
Solve →
39Crawler Log FolderEasy
ArrayStringStack
Solve →
40Create Maximum NumberHard
ArrayTwo PointersStack
Solve →
41Daily TemperaturesMedium
ArrayStackMonotonic Stack
Solve →
42Decode StringMedium
StringStackRecursion
Solve →
43Decoded String at IndexMedium
StringStack
Solve →
44Design a Stack With Increment OperationMedium
ArrayStackDesign
Solve →
45Design a Text EditorHard
Linked ListStringStack
Solve →
46Design an Expression Tree With Evaluate FunctionMedium
ArrayMathStack
Solve →
47Design Browser HistoryMedium
ArrayLinked ListStack
Solve →
48Dinner Plate StacksHard
Hash TableStackDesign
Solve →
49Double a Number Represented as a Linked ListMedium
Linked ListMathStack
Solve →
50Evaluate Reverse Polish NotationMedium
ArrayMathStack
Solve →
51Exclusive Time of FunctionsMedium
ArrayStack
Solve →
52Final Prices With a Special Discount in a ShopEasy
ArrayStackMonotonic Stack
Solve →
53Find Building Where Alice and Bob Can MeetHard
ArrayBinary SearchStack
Solve →
54Find Maximum Non-decreasing Array LengthHard
ArrayBinary SearchDynamic Programming
Solve →
55Find Mirror Score of a StringMedium
Hash TableStringStack
Solve →
56Find PermutationMedium
ArrayStringStack
Solve →
57Find the Most Competitive SubsequenceMedium
ArrayStackGreedy
Solve →
58Find the Number of Subarrays Where Boundary Elements Are MaximumHard
ArrayBinary SearchStack
Solve →
59Finding the Number of Visible MountainsMedium
ArrayStackSorting
Solve →
60Flatten Binary Tree to Linked ListMedium
Linked ListStackTree
Solve →
61Flatten Nested List IteratorMedium
StackTreeDepth-First Search
Solve →
62Implement Queue using StacksEasy
StackDesignQueue
Solve →
63Implement Stack using QueuesEasy
StackDesignQueue
Solve →
64Increasing Order Search TreeEasy
StackTreeDepth-First Search
Solve →
65Jump Game VIIIMedium
ArrayDynamic ProgrammingStack
Solve →
66Largest Rectangle in HistogramHard
ArrayStackMonotonic Stack
Solve →
67Lexicographically Minimum String After Removing StarsMedium
Hash TableStringStack
Solve →
68Lexicographically Smallest String After Deleting Duplicate CharactersHard
Hash TableStringStack
Solve →
69Longest Absolute File PathMedium
StringStackDepth-First Search
Solve →
70Longest Valid ParenthesesHard
StringDynamic ProgrammingStack
Solve →
71Longest Well-Performing IntervalMedium
ArrayHash TableStack
Solve →
72Make Array Non-decreasingMedium
ArrayStackGreedy
Solve →
73Make The String GreatEasy
StringStack
Solve →
74Max Chunks To Make Sorted IIHard
ArrayStackGreedy
Solve →
75Max Chunks To Make SortedMedium
ArrayStackGreedy
Solve →
76Max StackHard
Linked ListStackDesign
Solve →
77Maximal Range That Each Element Is Maximum in ItMedium
ArrayStackMonotonic Stack
Solve →
78Maximal RectangleHard
ArrayDynamic ProgrammingStack
Solve →
79Maximum Array Hopping Score IMedium
ArrayDynamic ProgrammingStack
Solve →
80Maximum Array Hopping Score IIMedium
ArrayStackGreedy
Solve →
81Maximum Balanced ShipmentsMedium
ArrayDynamic ProgrammingStack
Solve →
82Maximum Binary TreeMedium
ArrayDivide and ConquerStack
Solve →
83Maximum Frequency Score of a SubarrayHard
ArrayHash TableMath
Solve →
84Maximum Frequency StackHard
Hash TableStackDesign
Solve →
85Maximum Length of Semi-Decreasing SubarraysMedium
ArrayStackSorting
Solve →
86Maximum Nesting Depth of the ParenthesesEasy
StringStack
Solve →
87Maximum Nesting Depth of Two Valid Parentheses StringsMedium
StringStack
Solve →
88Maximum Number of Books You Can TakeHard
ArrayDynamic ProgrammingStack
Solve →
89Maximum of Minimum Values in All SubarraysMedium
ArrayStackMonotonic Stack
Solve →
90Maximum Score From Removing SubstringsMedium
StringStackGreedy
Solve →
91Maximum Score of a Good SubarrayHard
ArrayTwo PointersBinary Search
Solve →
92Maximum Subarray Min-ProductMedium
ArrayStackMonotonic Stack
Solve →
93Maximum Twin Sum of a Linked ListMedium
Linked ListTwo PointersStack
Solve →
94Maximum Width RampMedium
ArrayTwo PointersStack
Solve →
95Min StackMedium
StackDesign
Solve →
96Mini ParserMedium
StringStackDepth-First Search
Solve →
97Minimum Add to Make Parentheses ValidMedium
StringStackGreedy
Solve →
98Minimum Additions to Make Valid StringMedium
StringDynamic ProgrammingStack
Solve →
99Minimum Cost to Change the Final Value of ExpressionHard
MathStringDynamic Programming
Solve →
100Minimum Cost Tree From Leaf ValuesMedium
ArrayDynamic ProgrammingStack
Solve →
101Minimum Deletions to Make Array BeautifulMedium
ArrayStackGreedy
Solve →
102Minimum Deletions to Make String BalancedMedium
StringDynamic ProgrammingStack
Solve →
103Minimum Insertions to Balance a Parentheses StringMedium
StringStackGreedy
Solve →
104Minimum Number of Increments on Subarrays to Form a Target ArrayHard
ArrayDynamic ProgrammingStack
Solve →
105Minimum Number of Swaps to Make the String BalancedMedium
Two PointersStringStack
Solve →
106Minimum Number of Visited Cells in a GridHard
ArrayDynamic ProgrammingStack
Solve →
107Minimum Operations to Convert All Elements to ZeroMedium
ArrayHash TableStack
Solve →
108Minimum Operations to Make Array Equal to TargetHard
ArrayDynamic ProgrammingStack
Solve →
109Minimum Remove to Make Valid ParenthesesMedium
StringStack
Solve →
110Minimum String Length After Removing SubstringsEasy
StringStackSimulation
Solve →
111Minimum Time to Complete All TasksHard
ArrayBinary SearchStack
Solve →
112N-ary Tree Postorder TraversalEasy
StackTreeDepth-First Search
Solve →
113N-ary Tree Preorder TraversalEasy
StackTreeDepth-First Search
Solve →
114Nested List Weight Sum IIMedium
StackDepth-First SearchBreadth-First Search
Solve →
115Next Greater Element IEasy
ArrayHash TableStack
Solve →
116Next Greater Element IIMedium
ArrayStackMonotonic Stack
Solve →
117Next Greater Node In Linked ListMedium
ArrayLinked ListStack
Solve →
118Number of AtomsHard
Hash TableStringStack
Solve →
119Number of People That Can Be Seen in a GridMedium
ArrayStackMatrix
Solve →
120Number of Students Unable to Eat LunchEasy
ArrayStackQueue
Solve →
121Number of Valid SubarraysHard
ArrayStackMonotonic Stack
Solve →
122Number of Visible People in a QueueHard
ArrayStackMonotonic Stack
Solve →
123Odd Even JumpHard
ArrayDynamic ProgrammingStack
Solve →
124Online Stock SpanMedium
StackDesignMonotonic Stack
Solve →
125Palindrome Linked ListEasy
Linked ListTwo PointersStack
Solve →
126Parse Lisp ExpressionHard
Hash TableStringStack
Solve →
127Parsing A Boolean ExpressionHard
StringStackRecursion
Solve →
128Remove All Adjacent Duplicates in String IIMedium
StringStack
Solve →
129Remove All Adjacent Duplicates In StringEasy
StringStack
Solve →
130Remove All Occurrences of a SubstringMedium
StringStackSimulation
Solve →
131Remove Duplicate LettersMedium
StringStackGreedy
Solve →
132Remove K-Balanced SubstringsMedium
StringStackSimulation
Solve →
133Remove K DigitsMedium
StringStackGreedy
Solve →
134Remove Nodes From Linked ListMedium
Linked ListStackRecursion
Solve →
135Remove Outermost ParenthesesEasy
StringStack
Solve →
136Removing Stars From a StringMedium
StringStackSimulation
Solve →
137Reorder ListMedium
Linked ListTwo PointersStack
Solve →
138Replace Non-Coprime Numbers in ArrayHard
ArrayMathStack
Solve →
139Resulting String After Adjacent RemovalsMedium
StringStackSimulation
Solve →
140Reverse Prefix of WordEasy
Two PointersStringStack
Solve →
141Reverse Substrings Between Each Pair of ParenthesesMedium
StringStack
Solve →
142Robot CollisionsHard
ArrayStackSorting
Solve →
143Score of ParenthesesMedium
StringStack
Solve →
144Shortest Subarray to be Removed to Make Array SortedMedium
ArrayTwo PointersBinary Search
Solve →
145Shortest Unsorted Continuous SubarrayMedium
ArrayTwo PointersStack
Solve →
146Simplify PathMedium
StringStack
Solve →
147Smallest K-Length Subsequence With Occurrences of a LetterHard
StringStackGreedy
Solve →
148Smallest Subsequence of Distinct CharactersMedium
StringStackGreedy
Solve →
149Stamping The SequenceHard
StringStackGreedy
Solve →
150Steps to Make Array Non-decreasingMedium
ArrayLinked ListDynamic Programming
Solve →
151Subarray With Elements Greater Than Varying ThresholdHard
ArrayStackUnion-Find
Solve →
152Sum of Subarray MinimumsMedium
ArrayDynamic ProgrammingStack
Solve →
153Sum of Subarray RangesMedium
ArrayStackMonotonic Stack
Solve →
154Sum of Total Strength of WizardsHard
ArrayStackMonotonic Stack
Solve →
155Tag ValidatorHard
StringStack
Solve →
156Ternary Expression ParserMedium
StringStackRecursion
Solve →
157The Number of Weak Characters in the GameMedium
ArrayStackGreedy
Solve →
158The Score of Students Solving Math ExpressionHard
ArrayHash TableMath
Solve →
159Trapping Rain WaterHard
ArrayTwo PointersDynamic Programming
Solve →
160Two Sum BSTsMedium
Two PointersBinary SearchStack
Solve →
161Using a Robot to Print the Lexicographically Smallest StringMedium
Hash TableStringStack
Solve →
162Valid ParenthesesEasy
StringStack
Solve →
163Valid Parenthesis StringMedium
StringDynamic ProgrammingStack
Solve →
164Validate Stack SequencesMedium
ArrayStackSimulation
Solve →
165Verify Preorder Sequence in Binary Search TreeMedium
ArrayStackTree
Solve →
166Verify Preorder Serialization of a Binary TreeMedium
StringStackTree
Solve →
167Zuma GameHard
StringDynamic ProgrammingStack
Solve →