Next Greater Element (NGE) for Every Element of Array.

Given an array nums[] of distinct integers, find the next greater element for each element in the array. The next greater element is the first greater element to its right. If no such element exists, consider it as -1. Write a function to return an array containing the next greater elements in the input array.

Example:

Input: [3, 1, 4, 2]
Output: [4, 4, -1, -1]
Explanation:
- For element 3, the next greater element is 4.
- For element 1, the next greater element is 4.
- For element 4, there is no next greater element to its right, so it is -1.
- For element 2, there is no next greater element to its right, so it is -1.

Input: [4, 5, 2, 10, 8]
Output: [5, 10, 10, -1, -1]
Explanation:
- For element 4, the next greater element is 5.
- For element 5, the next greater element is 10.
- For element 2, the next greater element is 10.
- For element 10, there is no next greater element to its right, so it is -1.
- For element 8, there is no next greater element to its right, so it is -1.

This is one of the popular stack-based problems that has been asked in many interviews and here we will understand how to approach this problem starting with a brute force solution and then optimizing it using the stack data structure.

There are multiple ways of asking this same question in an interview and if you understand the solution to this one question I can guarantee that you will be able to solve the other similar kind of questions. These questions are:
  • Next Greater Element to its right.
  • Next Smaller Element to its right.
  • Next Greater Element to its left.
  • Next Smaller Element to its left.

Brute Force Approach to Find NGE to Right.

The brute force approach is quite simple for this question, using two nested loops. The outer loop will traverse the given input array and the inner will find the next greater element to the right side of the current index. 

Algorithm Steps:
  • Iterate through each element in the array.
  • For each element, iterate through the elements to its right.
  • Find the first element greater than the current element.
  • If found, set it as the next greater element. If not found, set it as -1.
  • Continue this process for each element in the array.

Below is the code implementation of the above approach:
// CPP program to find next greater element
#include<iostream>
#include<vector>
using namespace std;

// function to find next greater element
vector<int> nextGreaterElement(vector<int> nums) {
    int n = nums.size();
    vector<int> result(n, -1);

    for(int i = 0; i < n; i++) {
        for(int j = i+1; j < n; j++){
            if(nums[j] > nums[i]){
                result[i] = nums[j];
                break;
            }
        }
    }
    return result;
}
int main() {
    vector<int> nums = {4, 5, 2, 10, 8};

    vector<int> result = nextGreaterElement(nums);

    cout << "Input Array: ";
    for(int num:nums){
        cout << num << " ";
    }

    cout << "\nNext Greater Elements to Right: ";
    for(int num:result){
        cout << num << " ";
    }

    return 0;
}
// Java code to find next greater element
import java.util.Arrays;

public class NextGreaterElement {
    public static int[] nextGreaterElement(int[] nums) {
        int n = nums.length;
        int[] result = new int[n];
        Arrays.fill(result, -1);

        for (int i = 0; i < n; i++) {
            for (int j = i + 1; j < n; j++) {
                if (nums[j] > nums[i]) {
                    result[i] = nums[j];
                    break;
                }
            }
        }

        return result;
    }

    public static void main(String[] args) {
        int[] nums = {4, 5, 2, 10, 8};
        int[] result = nextGreaterElement(nums);

        System.out.print("Input Array: ");
        for (int num : nums) {
            System.out.print(num + " ");
        }

        System.out.println("\nNext Greater Elements to Right: " + Arrays.toString(result));
    }
}
# Python code to find next greater element
def nextGreaterElement(nums):
n = len(nums)
result = [-1] * n

for i in range(n):
    for j in range(i + 1, n):
        if nums[j] > nums[i]:
            result[i] = nums[j]
            break

return result

nums = [4, 5, 2, 10, 8]
result = nextGreaterElement(nums)

print("Input Array:", nums)
print("Next Greater Elements to Right:", result)
// C# code to find next greater element
using System;

class Program {
    static int[] NextGreaterElement(int[] nums) {
        int n = nums.Length;
        int[] result = new int[n];
        for (int i = 0; i < n; i++) {
            result[i] = -1;
            for (int j = i + 1; j < n; j++) {
                if (nums[j] > nums[i]) {
                    result[i] = nums[j];
                    break;
                }
            }
        }
        return result;
    }

    static void Main() {
        int[] nums = {4, 5, 2, 10, 8};
        int[] result = NextGreaterElement(nums);

        Console.Write("Input Array: ");
        foreach (int num in nums) {
            Console.Write(num + " ");
        }

        Console.WriteLine("\nNext Greater Elements to Right: " + string.Join(" ", result));
    }
}
Output:
Input Array: 4 5 2 10 8 
Next Greater Elements to Right: 5 10 10 -1 -1

  • Time Complexity: O(n^2) as we have used two nested loops to solve this problem.
  • Space Complexity: O(1) we have not used any extra space. 

Next Greater Element Using Stack.

The efficient way of solving this problem is by using a stack data structure. The stack helps keep track of potential candidates for the next greater element. Let's follow the algorithm steps given below to understand this approach in detail.

Algorithm Steps:
  • Initialize an empty stack to store indices of elements.
  • Create an array to store the result.
  • Iterate through the array from right to left.
  • -- If the stack is empty, set the result at index i to -1.
  • -- If the stack is not empty and the top element of the stack is greater than nums[i], then the top element is the next greater element, so update the result array at index i with the stack top.
  • -- If the stack is not empty and the top element of the stack is less than or equal to nums[i], pop elements from the stack until finding an element greater than nums[i]. Update the result array at index i with the stack top (if any).
  • -- Push the current element nums[i] onto the stack.
  • The resulting array now contains the next greater elements to the right for each element.

Below is the code implementation of the above approach:
// C++ code to find next greater element using stack
#include <iostream>
#include <vector>
#include <stack>
#include<algorithm>
using namespace std;

vector<int> nextGreaterElement(vector<int>& nums) {
    int n = nums.size();
    vector<int> result(n);
    stack<int> st;

    for (int i = n - 1; i >= 0; i--) {
        // stack is empty means no next greater element present
        if(st.size() == 0) {
            result[i] = -1;
        } else if(st.size() > 0 && st.top() > nums[i]) {
            result[i] = st.top();
        } else if(st.size() > 0 && st.top() <= nums[i]) {
            //pop the stack element until you find next greater
            while(st.size() > 0 && st.top() <= nums[i]){
                st.pop();
            }
            if(st.size() == 0) {
                result[i] = -1;
            } else {
                result[i] = st.top();
            }
        }
        st.push(nums[i]);
    }

    return result;
}

int main() {
    vector<int> nums = {4, 5, 2, 10, 8};
    vector<int> result = nextGreaterElement(nums);

    cout << "Input Array: ";
    for (int num : nums) {
        cout << num << " ";
    }
    
    cout << "\nNext Greater Elements to Right: ";
    for (int num : result) {
        cout << num << " ";
    }

    return 0;
}
// Java code to find the next greater element using stack
import java.util.Stack;
import java.util.Arrays;

public class NextGreaterElement {
    public static int[] nextGreaterElement(int[] nums) {
        int n = nums.length;
        int[] result = new int[n];
        Stack<Integer> stack = new Stack<>();

        for (int i = n - 1; i >= 0; i--) {
            if (stack.isEmpty()) {
                result[i] = -1;
            } else if (stack.peek() > nums[i]) {
                result[i] = stack.peek();
            } else {
                while (!stack.isEmpty() && stack.peek() <= nums[i]) {
                    stack.pop();
                }
                result[i] = stack.isEmpty() ? -1 : stack.peek();
            }
            stack.push(nums[i]);
        }

        return result;
    }

    public static void main(String[] args) {
        int[] nums = {4, 5, 2, 10, 8};
        int[] result = nextGreaterElement(nums);

        System.out.print("Input Array: ");
        for (int num : nums) {
            System.out.print(num + " ");
        }

        System.out.println("\nNext Greater Elements to Right: " + Arrays.toString(result));
    }
}
# Python code to find the next greater element using stack
def next_greater_element(nums):
n = len(nums)
result = [-1] * n
stack = []

for i in range(n - 1, -1, -1):
    if not stack:
        result[i] = -1
    elif stack[-1] > nums[i]:
        result[i] = stack[-1]
    else:
        while stack and stack[-1] <= nums[i]:
            stack.pop()
        result[i] = stack[-1] if stack else -1
    stack.append(nums[i])

return result

nums = [4, 5, 2, 10, 8]
result = next_greater_element(nums)
print(f"Input Array: {nums}")
print(f"Next Greater Elements to Right: {result}")
// C# code to find the next greater element using stack
using System;
using System.Collections.Generic;

class NextGreaterElement
{
    static int[] NextGreaterElementToRight(int[] nums)
    {
        int n = nums.Length;
        int[] result = new int[n];
        Stack<int> stack = new Stack<int>();

        for (int i = n - 1; i >= 0; i--)
        {
            if (stack.Count == 0)
            {
                result[i] = -1;
            }
            else if (stack.Peek() > nums[i])
            {
                result[i] = stack.Peek();
            }
            else
            {
                while (stack.Count > 0 && stack.Peek() <= nums[i])
                {
                    stack.Pop();
                }
                result[i] = (stack.Count == 0) ? -1 : stack.Peek();
            }
            stack.Push(nums[i]);
        }

        return result;
    }

    static void Main()
    {
        int[] nums = { 4, 5, 2, 10, 8 };
        int[] result = NextGreaterElementToRight(nums);

        Console.Write("Input Array: ");
        foreach (int num in nums)
        {
            Console.Write(num + " ");
        }

        Console.WriteLine("\nNext Greater Elements to Right: " + "[" + string.Join(", ", result) + "]");
    }
}
Output:
Input Array: 4 5 2 10 8 
Next Greater Elements to Right: 5 10 10 -1 -1

  • Time Complexity: The time complexity of finding the next greater element using stack is O(n) because the next greater element is found on top of the stack
  • Space Complexity: As we are using a stack to store the elements while traversing so space complexity will be O(n). 

Maximum Depth of Nested Parenthesis.

Given a string consisting of opening and closing parentheses, find the maximum depth of nested parentheses. The depth of a valid nested parentheses expression is defined as the number of parenthesis pairs that are properly nested. Implement a function that takes a string as input and returns the maximum depth of nested parentheses.

  • The input string s consists of parentheses characters '(' and ')' only.
  • The length of s is between 1 and 1000.
Example:
Input: "(A)"
Output: 1
Explanation: The depth of the parentheses is 1.

Input: "((A+B))+(A(B-(C*D)))"
Output: 3
Explanation: The depth of the parentheses is 3.

You might have already guessed that this problem is a standard stack-based problem in which we have to find the maximum depth of the nested parenthesis. In this article, I will explain two different approaches to solving this problem one is of course using stack and another solution is without using any additional data structure. 

Maximum Depth of Nested Parenthesis using Stack.

In this approach, we use a stack to track the depth of the parenthesis at any particular moment while traversing the given parenthesis string. We will also keep a variable to keep updating the maximum depth whenever we meet a closing parenthesis.

Algorithm Steps:
  • Initialize an empty stack to keep track of opening parenthesis.
  • Create a variable count and initialize it with 0, it will store the maximum depth of nested parenthesis.
  • Traverse the given input string and follow the below steps:
  • If the character is opening parenthesis '(' then push it into the stack.
  • If the character is a closing parenthesis ')' then update the value of the count if it is less than the current stack size. Pop an element from the stack.
  • Return the count variable as the maximum depth of parenthesis.

Below is the code implementation of the above approach:
// C++ code to find the maximum depth
// of nested parenthesis 
#include <iostream>
#include<stack>
using namespace std;

int maxDepth(string str) {
    stack<char> st;
    int count = 0;

    for(char c:str) {
        if(c == '(') {
            // insert the opening parenthesis 
            st.push(c);
        }else if(c == ')'){
            // update the max depth 
            if(count < st.size()) {
                count = st.size();
            }
            st.pop();
        }
    }
    return count;
}
int main() {
    string str = "((A+B))+(A(B-(C*D)))";

    int result = maxDepth(str);

    cout<< "Maximum Depth: " <<result <<endl;
    return 0;
}
// Java code implementation to find maximum
// depth of nested parenthesis
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        String str = "((A+B))+(A(B-(C*D)))";

        int result = maxDepth(str);

        System.out.println("Maximum Depth: " + result);
    }

    public static int maxDepth(String str) {
        Stack<Character> st = new Stack<>();
        int count = 0;

        for (char c : str.toCharArray()) {
            // insert the opening parenthesis in stack 
            if (c == '(') {
                st.push(c);
            } else if (c == ')') {
                // update the max depth
                if (count < st.size()) {
                    count = st.size();
                }
                st.pop();
            }
        }

        return count;
    }
}
# Python code to find the max depth of parenthesis
def max_depth(s):
stack = []
max_depth = 0

for char in s:
    if char == '(':
        stack.append(char)
    elif char == ')':
        if len(stack) > max_depth:
            max_depth = len(stack)
        stack.pop()

return max_depth

s = "((A+B))+(A(B-(C*D)))"
result = max_depth(s)
print("Maximum Depth:", result)
// C# code to find max depth of nested parenthesis
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        string str = "((A+B))+(A(B-(C*D)))";

        int result = MaxDepth(str);

        Console.WriteLine("Maximum Depth: " + result);
    }

    public static int MaxDepth(string str)
    {
        Stack<char> st = new Stack<char>();
        int count = 0;

        foreach (char c in str)
        {
            if (c == '(')
            {
                st.Push(c);
            }
            else if (c == ')')
            {
                if (count < st.Count)
                {
                    count = st.Count;
                }
                st.Pop();
            }
        }

        return count;
    }
}
Output:
Maximum Depth: 3

  • Time Complexity: O(n) where n is the size of the given input string.
  • Space Complexity: O(n) as we are using an extra stack to store open parenthesis.

Maximum Depth of Nested Parenthesis Without Using Stack.

In this approach, we are not using any additional data structure like stack. If we observe the previous solution carefully then we figure out that whenever we meet a close parenthesis we are checking the current depth of the stack so we do not need to store the element in the stack. Instead, we can use a variable that will tell us the current depth, and each time we meet a closing parenthesis we will update the maximum of current and previous depth.

Algorithm steps:
  • Initialize a variable depth to keep track of the current nesting depth. Initially set to 0.
  • Initialize a variable ans to store the maximum depth encountered during the iteration. Initially set to 0.
  • Iterate through the given string and follow the steps below:
  • If the current character is opening parenthesis then increase the value of depth by 1.
  • Update ans with the maximum value between its current value and the current depth.
  • If the current character is a closing parenthesis ')', decrement the depth to indicate the end of nesting.
  • After iterating through the entire string, return the final maximum depth stored in ans

Below is the code implementation of the above approach:
// C++ code to find the maximum depth
// of nested parenthesis without stack
#include <iostream>
#include<stack>
using namespace std;

int maxDepth(string str) {
    int depth = 0;
    int ans = 0;

    for(char c:str) {
        if(c == '(') {
            depth++;
            // update the current max depth
            ans = max(ans, depth);
        }else if(c == ')'){
            depth--;
        }
    }
    return ans;
}
int main() {
    string str = "((A+B))+(A(B-(C*D)))";

    int result = maxDepth(str);

    cout<< "Maximum Depth: " <<result <<endl;
    return 0;
}
// Java code to find the maximum depth
// of nested parenthesis without stack
public class MaxDepth {
    public static int maxDepth(String str) {
        int depth = 0;
        int ans = 0;

        for (char c : str.toCharArray()) {
            if (c == '(') {
                depth++;
                ans = Math.max(ans, depth);
            } else if (c == ')') {
                depth--;
            }
        }
        return ans;
    }

    public static void main(String[] args) {
        String str = "((A+B))+(A(B-(C*D)))";
        int result = maxDepth(str);
        System.out.println("Maximum Depth: " + result);
    }
}
# Maximum Depth of parenthesis in O(1) space
def max_depth(s):
depth = 0
ans = 0

for c in s:
    if c == '(':
        depth += 1
        ans = max(ans, depth)
    elif c == ')':
        depth -= 1

return ans

str_input = "((A+B))+(A(B-(C*D)))"
result = max_depth(str_input)
print("Maximum Depth:", result)
// C# code to find depth of nested parenthesis
using System;

class Program {
    static int MaxDepth(string str) {
        int depth = 0;
        int ans = 0;

        foreach (char c in str) {
            if (c == '(') {
                depth++;
                ans = Math.Max(ans, depth);
            } else if (c == ')') {
                depth--;
            }
        }

        return ans;
    }

    static void Main() {
        string str = "((A+B))+(A(B-(C*D)))";
        int result = MaxDepth(str);
        Console.WriteLine("Maximum Depth: " + result);
    }
}
Output:
Maximum Depth: 3

  • Time Complexity: O(n) where n is the size of the input string.
  • Space Complexity: O(1) as we are not using any extra space except two variables to store the current and maximum depth.

Remove Outermost Parenthesis of Primative String.

Given a string representing a valid parentheses sequence, your task is to remove the outermost parentheses of every primitive pair of parentheses. A primitive pair of parentheses is a pair that is not part of any other parentheses. Implement a function that takes a string as input and returns a modified string with the outermost parentheses removed.

  • The input string s consists of parentheses characters '(' and ')' only.
  • The length of s is between 1 and 1000.

Example:
Input: "(()())(())"
Output: "()()()"
Explanation: After removing the outermost parentheses of each primitive pair, the resulting string is "()()()"

Input: "((()(())))"
Output: "(()(()))"
Explanation: After removing the outermost parentheses of each primitive pair, the resulting string is "(()(()))".

There are different approaches to solving this problem of removing outermost parenthesis and here we are going to discuss two of them. Let's see each of these approaches one by one:

Remove the Outermost Parenthesis using Stack.

This approach leverages a stack data structure to keep track of opening parentheses. By iterating through the input string and using the stack to identify pairs of parentheses, the algorithm selectively removes the outermost parentheses, resulting in a modified string without those outermost pairs.

Algorithm Steps:
  • Initialize an empty stack to keep track of opening parenthesis.
  • Initialize an empty string (result) to store the modified string.
  • Iterate through each character of the given input string:
  • If the character is an opening parenthesis '(' push it onto the stack.
  • If the character is closing parenthesis ')' pop from the stack and if the stack is not empty after popping then add the character to the result string.
  • Return the result string. 

Below is the code implementation of the above approach:
// C++ code to remove outermost parenthesis 
#include <iostream>
#include <stack>
using namespace std;

//function
string removeOuterParentheses(string s) {
    stack<char> parenthesesStack;
    string result = "";

    for (char c : s) {
        if (c == '(') {
            if (!parenthesesStack.empty()) {
                result += c;
            }
            parenthesesStack.push(c);
        } else {
            parenthesesStack.pop();
            if (!parenthesesStack.empty()) {
                result += c;
            }
        }
    }

    return result;
}

int main() {
    string input = "(()())(())";
    string output = removeOuterParentheses(input);

    cout << "Original String: " << input << endl;
    cout << "Removing outermost parentheses: " << output << endl;

    return 0;
}
// Java code to remove outermost Parenthesis 
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        String input = "(()())(())";
        String output = removeOuterParentheses(input);

        System.out.println("Original String: " + input);
        System.out.println("Removing outermost parentheses: " + output);
    }

    public static String removeOuterParentheses(String s) {
        Stack<Character> parenthesesStack = new Stack<>();
        StringBuilder result = new StringBuilder();

        for (char c : s.toCharArray()) {
            if (c == '(') {
                if (!parenthesesStack.isEmpty()) {
                    result.append(c);
                }
                parenthesesStack.push(c);
            } else {
                parenthesesStack.pop();
                if (!parenthesesStack.isEmpty()) {
                    result.append(c);
                }
            }
        }

        return result.toString();
    }
}
# Python code to remove outermost parenthesis
def removeOuterParentheses(s):
parentheses_stack = []
result = ""

for c in s:
    if c == '(':
        if parentheses_stack:
            result += c
        parentheses_stack.append(c)
    else:
        parentheses_stack.pop()
        if parentheses_stack:
            result += c

return result

input_str = "(()())(())"
output_str = removeOuterParentheses(input_str)

print("Original String:", input_str)
print("Removing outermost parentheses:", output_str)
//C# code to remove outermost parenthesis
using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        string input = "(()())(())";
        string output = RemoveOuterParentheses(input);

        Console.WriteLine("Original String: " + input);
        Console.WriteLine("Removing outermost parentheses: " + output);
    }

    public static string RemoveOuterParentheses(string s)
    {
        Stack<char> parenthesesStack = new Stack<char>();
        System.Text.StringBuilder result = new System.Text.StringBuilder();

        foreach (char c in s)
        {
            if (c == '(')
            {
                if (parenthesesStack.Count > 0)
                {
                    result.Append(c);
                }
                parenthesesStack.Push(c);
            }
            else
            {
                parenthesesStack.Pop();
                if (parenthesesStack.Count > 0)
                {
                    result.Append(c);
                }
            }
        }

        return result.ToString();
    }
}
Output:
Original String: (()())(())
Removing outermost parentheses: ()()()

  • Time Complexity: We are traversing the complete string only once so the time complexity will be O(n) where n is the length of the given input string.
  • Space Complexity: We are using an extra stack to solve the problem and we are also using an extra string just to store our modified string so overall space complexity will be O(n).

Remove the Outermost Parenthesis Without Using Stack.

In this approach, the algorithm maintains a count of the depth of parentheses while iterating through the input string. By intelligently deciding which parentheses to include in the modified string based on their depth, the algorithm effectively removes the outermost parentheses of each primitive pair. This depth-counting approach provides a simple yet efficient solution to the problem.

Algorithm Steps:
  • Initialize an empty string (result) to store the modified string.
  • Initialize a variable (depth) to keep track of the depth of parentheses.
  • Iterate through each character of the given string:
  • If the character is an opening parenthesis ( and the depth is greater than 0, add it to the result.
  • If the character is a closing parenthesis ) and the depth is greater than 1, add it to the result.
  • Update the depth based on the current character.
  • Return the result string.

Below is the code implementation of the above approach:
// C++ code to remove outermost parenthesis 
// without using stack 
#include <iostream>
using namespace std;

string removeOuterParentheses(string s) {
    string result = "";
    int depth = 0;

    for (char c : s) {
        if(c == '(') {
            if(depth > 0){
                result += c;
            }
            depth++;
        } else{
            depth--;
            if(depth > 0) {
                result += c;
            }
        }
    }

    return result;
}

int main() {
    string input = "(()())(())";
    string output = removeOuterParentheses(input);

    cout << "Original String: " << input << endl;
    cout << "Removing outermost parentheses: " << output << endl;

    return 0;
}
// Java code to remove Outermost Parenthesis without using stack
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        String input = "(()())(())";
        String output = removeOuterParentheses(input);

        System.out.println("Original String: " + input);
        System.out.println("Removing outermost parentheses: " + output);
    }

    public static String removeOuterParentheses(String s) {
        int depth = 0;
        StringBuilder result = new StringBuilder();

        for (char c : s.toCharArray()) {
            if (c == '(') {
                if (depth > 0) {
                    result.append(c);
                }
                depth++;
            } else {
                depth--;
                if (depth > 0) {
                    result.append(c);
                }
            }
        }

        return result.toString();
    }
}
# Python code to remove outermost parenthesis 
# without using stack
def remove_outer_parentheses(s):
    result = ""
    depth = 0

    for c in s:
        if c == '(':
            if depth > 0:
                result += c
            depth += 1
        else:
            depth -= 1
            if depth > 0:
                result += c

    return result

# Example usage
input_str = "(()())(())"
output_str = remove_outer_parentheses(input_str)

print("Original String:", input_str)
print("Removing outermost parentheses:", output_str)
// C# code implementation to remove 
// outermost parenthesis without using stack
using System;

class Program
{
    static void Main()
    {
        string input = "(()())(())";
        string output = RemoveOuterParentheses(input);

        Console.WriteLine("Original String: " + input);
        Console.WriteLine("Removing outermost parentheses: " + output);
    }

    public static string RemoveOuterParentheses(string s)
    {
        string result = "";
        int depth = 0;

        foreach (char c in s)
        {
            if (c == '(')
            {
                if (depth > 0)
                {
                    result += c;
                }
                depth++;
            }
            else
            {
                depth--;
                if (depth > 0)
                {
                    result += c;
                }
            }
        }

        return result;
    }
}
Output:
Original String: (()())(())
Removing outermost parentheses: ()()()

  • Time Complexity: We are traversing the given input string only once so the time complexity will be O(n) where n is the length of the given string.
  • Space Complexity: We are not using any extra space except the result string which we are using only to store our answer so the overall space complexity is O(1).

DON'T MISS

Nature, Health, Fitness
© all rights reserved
made with by AlgoLesson