Skip to content

Commit 9ba0ae3

Browse files
committed
add monotonic stack pattern
1 parent 4dbefcd commit 9ba0ae3

File tree

8 files changed

+270
-0
lines changed

8 files changed

+270
-0
lines changed

‎patterns/c#/MonotonicStack.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System;
2+
using System.Collections.Generic;
3+
4+
public class MonotonicStack {
5+
public int[] NextGreaterElement(int[] nums) {
6+
int n = nums.Length;
7+
int[] result = new int[n];
8+
Array.Fill(result, -1); // Default to -1 if no greater element exists
9+
Stack<int> stack = new Stack<int>(); // Stack stores indices
10+
11+
for (int i = 0; i < n; i++) {
12+
while (stack.Count > 0 && nums[i] > nums[stack.Peek()]) {
13+
int index = stack.Pop();
14+
result[index] = nums[i];
15+
}
16+
stack.Push(i);
17+
}
18+
return result;
19+
}
20+
21+
public int[] DailyTemperatures(int[] temperatures) {
22+
int n = temperatures.Length;
23+
int[] result = new int[n]; // Result array initialized with 0s
24+
Stack<int> stack = new Stack<int>(); // Monotonic decreasing stack
25+
26+
for (int i = 0; i < n; i++) {
27+
while (stack.Count > 0 && temperatures[i] > temperatures[stack.Peek()]) {
28+
int prevIndex = stack.Pop();
29+
result[prevIndex] = i - prevIndex;
30+
}
31+
stack.Push(i);
32+
}
33+
return result;
34+
}
35+
}

‎patterns/c++/KadaneAlgorithm.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#include <vector>
2+
#include <algorithm> // For std::max
3+
4+
class KadaneAlgorithm {
5+
public:
6+
int maxSubArray(std::vector<int>& nums) {
7+
int currentSum = nums[0]; // Start with the first element
8+
int maxSum = nums[0]; // Initialize maxSum with the first element
9+
10+
// Traverse the array from the second element
11+
for (size_t i = 1; i < nums.size(); i++) {
12+
// If currentSum is negative, reset to current element
13+
currentSum = std::max(nums[i], currentSum + nums[i]);
14+
// Update maxSum if currentSum is greater
15+
maxSum = std::max(maxSum, currentSum);
16+
}
17+
return maxSum;
18+
}
19+
};

‎patterns/c++/MonotonicStack.cpp

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#include <vector>
2+
#include <stack>
3+
4+
using namespace std;
5+
6+
class MonotonicStack {
7+
public:
8+
vector<int> nextGreaterElement(vector<int>& nums) {
9+
int n = nums.size();
10+
vector<int> result(n, -1); // Default to -1 if no greater element exists
11+
stack<int> stack; // Stack stores indices
12+
13+
for (int i = 0; i < n; i++) {
14+
while (!stack.empty() && nums[i] > nums[stack.top()]) {
15+
int index = stack.top();
16+
stack.pop();
17+
result[index] = nums[i];
18+
}
19+
stack.push(i);
20+
}
21+
return result;
22+
}
23+
24+
vector<int> dailyTemperatures(vector<int>& temperatures) {
25+
int n = temperatures.size();
26+
vector<int> result(n, 0);
27+
stack<int> stack; // Monotonic decreasing stack
28+
29+
for (int i = 0; i < n; i++) {
30+
while (!stack.empty() && temperatures[i] > temperatures[stack.top()]) {
31+
int prevIndex = stack.top();
32+
stack.pop();
33+
result[prevIndex] = i - prevIndex;
34+
}
35+
stack.push(i);
36+
}
37+
return result;
38+
}
39+
};

‎patterns/go/monotonic_stack.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package main
2+
3+
import "fmt"
4+
5+
func nextGreaterElement(nums []int) []int {
6+
n := len(nums)
7+
result := make([]int, n)
8+
for i := range result {
9+
result[i] = -1 // Default to -1 if no greater element exists
10+
}
11+
stack := []int{} // Stack stores indices
12+
13+
for i := 0; i < n; i++ {
14+
for len(stack) > 0 && nums[i] > nums[stack[len(stack)-1]] {
15+
index := stack[len(stack)-1]
16+
stack = stack[:len(stack)-1]
17+
result[index] = nums[i]
18+
}
19+
stack = append(stack, i)
20+
}
21+
return result
22+
}
23+
24+
func dailyTemperatures(temperatures []int) []int {
25+
n := len(temperatures)
26+
result := make([]int, n) // Result array initialized with 0s
27+
stack := []int{} // Monotonic decreasing stack
28+
29+
for i := 0; i < n; i++ {
30+
for len(stack) > 0 && temperatures[i] > temperatures[stack[len(stack)-1]] {
31+
prevIndex := stack[len(stack)-1]
32+
stack = stack[:len(stack)-1]
33+
result[prevIndex] = i - prevIndex
34+
}
35+
stack = append(stack, i)
36+
}
37+
return result
38+
}
39+
40+
func main() {
41+
nums := []int{2, 1, 5, 6, 2, 3}
42+
fmt.Println(nextGreaterElement(nums))
43+
44+
temperatures := []int{73, 74, 75, 71, 69, 72, 76, 73}
45+
fmt.Println(dailyTemperatures(temperatures))
46+
}

‎patterns/java/MonotonicStack.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package patterns.java;
2+
3+
import java.util.Arrays;
4+
import java.util.Stack;
5+
6+
public class MonotonicStack {
7+
8+
public int[] nextGreaterElement(int[] nums) {
9+
int n = nums.length;
10+
int[] result = new int[n]; // Output array
11+
Arrays.fill(result, -1); // Default to -1 if no greater element exists
12+
Stack<Integer> stack = new Stack<>(); // Stack stores indices
13+
14+
// Iterate through the array
15+
for (int i = 0; i < n; i++) {
16+
// While stack is not empty and current element is greater than stack top
17+
while (!stack.isEmpty() && nums[i] > nums[stack.peek()]) {
18+
int index = stack.pop(); // Pop the top element
19+
result[index] = nums[i]; // The current element is the Next Greater Element
20+
}
21+
stack.push(i); // Push the current index onto the stack
22+
}
23+
return result;
24+
}
25+
26+
public int[] dailyTemperatures(int[] temperatures) {
27+
int n = temperatures.length;
28+
int[] result = new int[n]; // Result array initialized with 0s
29+
Stack<Integer> stack = new Stack<>(); // Monotonic decreasing stack (stores indices)
30+
31+
// Iterate through the temperature array
32+
for (int i = 0; i < n; i++) {
33+
// While stack is not empty AND the current temperature is warmer than the temperature at stack top
34+
while (!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) {
35+
int prevIndex = stack.pop(); // Pop the previous day's index
36+
result[prevIndex] = i - prevIndex; // Calculate the wait time
37+
}
38+
stack.push(i); // Push current index onto the stack
39+
}
40+
41+
return result; // Return the computed results
42+
}
43+
}

‎patterns/javascript/monotonicStack.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class MonotonicStack {
2+
nextGreaterElement(nums) {
3+
let n = nums.length;
4+
let result = new Array(n).fill(-1); // Default to -1 if no greater element exists
5+
let stack = []; // Stack stores indices
6+
7+
for (let i = 0; i < n; i++) {
8+
while (stack.length > 0 && nums[i] > nums[stack[stack.length - 1]]) {
9+
let index = stack.pop();
10+
result[index] = nums[i];
11+
}
12+
stack.push(i);
13+
}
14+
return result;
15+
}
16+
17+
dailyTemperatures(temperatures) {
18+
let n = temperatures.length;
19+
let result = new Array(n).fill(0); // Result array initialized with 0s
20+
let stack = []; // Monotonic decreasing stack
21+
22+
for (let i = 0; i < n; i++) {
23+
while (stack.length > 0 && temperatures[i] > temperatures[stack[stack.length - 1]]) {
24+
let prevIndex = stack.pop();
25+
result[prevIndex] = i - prevIndex;
26+
}
27+
stack.push(i);
28+
}
29+
return result;
30+
}
31+
}

‎patterns/python/monotonic_stack.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
class MonotonicStack:
2+
def next_greater_element(self, nums):
3+
n = len(nums)
4+
result = [-1] * n # Default to -1 if no greater element exists
5+
stack = [] # Stack stores indices
6+
7+
for i in range(n):
8+
while stack and nums[i] > nums[stack[-1]]:
9+
index = stack.pop()
10+
result[index] = nums[i]
11+
stack.append(i)
12+
13+
return result
14+
15+
def daily_temperatures(self, temperatures):
16+
n = len(temperatures)
17+
result = [0] * n # Result array initialized with 0s
18+
stack = [] # Monotonic decreasing stack
19+
20+
for i in range(n):
21+
while stack and temperatures[i] > temperatures[stack[-1]]:
22+
prev_index = stack.pop()
23+
result[prev_index] = i - prev_index
24+
stack.append(i)
25+
26+
return result

‎patterns/typescript/monotonicStack.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
class MonotonicStack {
2+
nextGreaterElement(nums: number[]): number[] {
3+
let n = nums.length;
4+
let result: number[] = new Array(n).fill(-1); // Default to -1 if no greater element exists
5+
let stack: number[] = []; // Stack stores indices
6+
7+
for (let i = 0; i < n; i++) {
8+
while (stack.length > 0 && nums[i] > nums[stack[stack.length - 1]]) {
9+
let index = stack.pop()!;
10+
result[index] = nums[i];
11+
}
12+
stack.push(i);
13+
}
14+
return result;
15+
}
16+
17+
dailyTemperatures(temperatures: number[]): number[] {
18+
let n = temperatures.length;
19+
let result: number[] = new Array(n).fill(0); // Result array initialized with 0s
20+
let stack: number[] = []; // Monotonic decreasing stack
21+
22+
for (let i = 0; i < n; i++) {
23+
while (stack.length > 0 && temperatures[i] > temperatures[stack[stack.length - 1]]) {
24+
let prevIndex = stack.pop()!;
25+
result[prevIndex] = i - prevIndex;
26+
}
27+
stack.push(i);
28+
}
29+
return result;
30+
}
31+
}

0 commit comments

Comments
 (0)