Closest greater or same value on left side for every element in array
Last Updated : 25 Feb, 2025
Given an array arr[]
of size n
. For each element in the array, find the value wise closest element to its left that is greater than or equal to the current element. If no such element exists, return -1
for that position.
Examples:
Input : arr[] = [10, 5, 11, 6, 20, 12]
Output : [-1, 10, -1, 10, -1, 20]
Explanation: The first element has nothing on the left side, so the answer for first is -1.
Second, element 5 has 10 on the left, so the answer is 10.
Third element 11 has nothing greater or the same, so the answer is -1.
Fourth element 6 has 10 as value wise closest, so the answer is 10.
Similarly, we get values for the fifth and sixth elements.
Input : arr[] = [1, 2, 3, 4, 5]
Output : [-1, -1, -1, -1, -1]
Explanation: The given array is arranged in strictly increasing order, and all the elements on left of any element are smaller. Thus no index has any value greater or equal in its left.
Input : arr[] = [5, 4, 3, 2, 1]
Output : [-1, 5, 4, 3, 2]
[Naive Approach] - Using Nested Loops - O(n^2) Time and O(1) Auxiliary Space
A idea is to run two nested loops. We pick an outer element one by one. For every picked element, we traverse toward the left of it and find the closest (value-wise) greater element.
C++ #include <bits/stdc++.h> using namespace std; // Function to find the closest greater element // on the left of every element of the array vector<int> closestGreater(vector<int> &arr) { int n = arr.size(); // to store the results vector<int> res(n, -1); for (int i = 1; i < n; i++) { // stores the minimum difference int diff = INT_MAX; // traverse left side to i-th element for (int j = 0; j < i; j++) { if (arr[j] >= arr[i]) diff = min(diff, arr[j] - arr[i]); } // if greater or equal value exists if (diff != INT_MAX) res[i] = arr[i] + diff; } return res; } int main() { vector<int> arr = { 10, 5, 11, 6, 20, 12 }; vector<int> res = closestGreater(arr); for(auto i:res) { cout<<i<<" "; } return 0; }
Java // Function to find the closest greater element // on the left of every element of the array import java.util.*; class GfG { // Function to find the closest greater element static int[] closestGreater(int[] arr) { int n = arr.length; // to store the results int[] res = new int[n]; for (int i = 0; i < n; i++) { res[i] = -1; } for (int i = 1; i < n; i++) { // stores the minimum difference int diff = Integer.MAX_VALUE; // traverse left side to i-th element for (int j = 0; j < i; j++) { if (arr[j] >= arr[i]) diff = Math.min(diff, arr[j] - arr[i]); } // if greater or equal value exists if (diff != Integer.MAX_VALUE) res[i] = arr[i] + diff; } return res; } public static void main(String[] args) { int[] arr = {10, 5, 11, 6, 20, 12}; int[] res = closestGreater(arr); for (int i : res) { System.out.print(i + " "); } } }
Python # Function to find the closest greater element # on the left of every element of the array def closestGreater(arr): n = len(arr) # to store the results res = [-1] * n for i in range(1, n): # stores the minimum difference diff = float('inf') # traverse left side to i-th element for j in range(i): if arr[j] >= arr[i]: diff = min(diff, arr[j] - arr[i]) # if greater or equal value exists if diff != float('inf'): res[i] = arr[i] + diff return res if __name__ == "__main__": arr = [10, 5, 11, 6, 20, 12] res = closestGreater(arr) for i in res: print(i, end=" ")
C# // Function to find the closest greater element // on the left of every element of the array using System; class GfG { // Function to find the closest greater element static int[] closestGreater(int[] arr) { int n = arr.Length; // to store the results int[] res = new int[n]; for (int i = 0; i < n; i++) { res[i] = -1; } for (int i = 1; i < n; i++) { // stores the minimum difference int diff = int.MaxValue; // traverse left side to i-th element for (int j = 0; j < i; j++) { if (arr[j] >= arr[i]) diff = Math.Min(diff, arr[j] - arr[i]); } // if greater or equal value exists if (diff != int.MaxValue) res[i] = arr[i] + diff; } return res; } static void Main() { int[] arr = {10, 5, 11, 6, 20, 12}; int[] res = closestGreater(arr); foreach (int i in res) { Console.Write(i + " "); } } }
JavaScript // Function to find the closest greater element // on the left of every element of the array function closestGreater(arr) { let n = arr.length; // to store the results let res = new Array(n).fill(-1); for (let i = 1; i < n; i++) { // stores the minimum difference let diff = Infinity; // traverse left side to i-th element for (let j = 0; j < i; j++) { if (arr[j] >= arr[i]) diff = Math.min(diff, arr[j] - arr[i]); } // if greater or equal value exists if (diff !== Infinity) res[i] = arr[i] + diff; } return res; } let arr = [10, 5, 11, 6, 20, 12]; let res = closestGreater(arr); for (let i of res) { process.stdout.write(i + " "); }
[Expected Approach] - Using Set - O(n Log n) Time and O(n) Auxiliary Space
The idea is to use Tree Set (or Sorted Set or Set in C++) to store the elements on left of every element, ensuring that elements are stored in sorted order. Thereafter, for each element of the array arr[], find the closest greater or equal value in O(Log n) Time.
C++ #include <bits/stdc++.h> using namespace std; // Function to find the closest greater element // on the left of every element of the array vector<int> closestGreater(vector<int> &arr) { int n = arr.size(); // to store the results vector<int> res(n, -1); // to store the elements in sorted order set<int> s; for (int i = 0; i < n; i++) { // First search in set auto it = s.lower_bound(arr[i]); // If greater or equal value exists if (it != s.end()) res[i] = *it; // insert the current element in the set s.insert(arr[i]); } return res; } int main() { vector<int> arr = { 10, 5, 11, 6, 20, 12 }; vector<int> res = closestGreater(arr); for(auto i:res) { cout<<i<<" "; } return 0; }
Java // Function to find the closest greater element // on the left of every element of the array import java.util.TreeSet; class GfG { // Function to find the closest greater element static int[] closestGreater(int[] arr) { int n = arr.length; // to store the results int[] res = new int[n]; for (int i = 0; i < n; i++) { res[i] = -1; } // to store the elements in sorted order TreeSet<Integer> s = new TreeSet<>(); for (int i = 0; i < n; i++) { // First search in set Integer it = s.ceiling(arr[i]); // If greater or equal value exists if (it != null) res[i] = it; // insert the current element in the set s.add(arr[i]); } return res; } public static void main(String[] args) { int[] arr = {10, 5, 11, 6, 20, 12}; int[] res = closestGreater(arr); for (int i : res) { System.out.print(i + " "); } } }
Python # Function to find the closest greater element # on the left of every element of the array import bisect def closestGreater(arr): n = len(arr) # to store the results res = [-1] * n # to store the elements in sorted order s = [] for i in range(n): # First search in set idx = bisect.bisect_left(s, arr[i]) # If greater or equal value exists if idx < len(s): res[i] = s[idx] # insert the current element in the set bisect.insort(s, arr[i]) return res if __name__ == "__main__": arr = [10, 5, 11, 6, 20, 12] res = closestGreater(arr) for i in res: print(i, end=" ")
C# // Function to find the closest greater element // on the left of every element of the array using System; using System.Collections.Generic; class GfG { // Function to find the closest greater element static int[] closestGreater(int[] arr) { int n = arr.Length; // to store the results int[] res = new int[n]; for (int i = 0; i < n; i++) { res[i] = -1; } // to store the elements in sorted order SortedSet<int> s = new SortedSet<int>(); for (int i = 0; i < n; i++) { // First search in set int? it = null; var view = s.GetViewBetween(arr[i], int.MaxValue); if (view.Count > 0) { it = view.Min; } // If greater or equal value exists if (it != null) res[i] = it.Value; // insert the current element in the set s.Add(arr[i]); } return res; } static void Main() { int[] arr = {10, 5, 11, 6, 20, 12}; int[] res = closestGreater(arr); foreach (int i in res) { Console.Write(i + " "); } } }
JavaScript // Function to find the closest greater element // on the left of every element of the array function closestGreater(arr) { let n = arr.length; // to store the results let res = new Array(n).fill(-1); // to store the elements in sorted order let s = []; for (let i = 0; i < n; i++) { // First search in set let lo = 0, hi = s.length, candidate = null; while (lo < hi) { let mid = Math.floor((lo + hi) / 2); if (s[mid] < arr[i]) lo = mid + 1; else { candidate = s[mid]; hi = mid; } } // If greater or equal value exists if (candidate !== null) res[i] = candidate; // insert the current element in the set in sorted order s.splice(lo, 0, arr[i]); } return res; } let arr = [10, 5, 11, 6, 20, 12]; let res = closestGreater(arr); for (let i = 0; i < res.length; i++) { process.stdout.write(res[i] + " "); }
Similar Reads
Find closest value for every element in array Given an array of integers, find the closest element for every element. Examples: Input : arr[] = {10, 5, 11, 6, 20, 12} Output : 11 6 12 5 12 11 Input : arr[] = {10, 5, 11, 10, 20, 12} Output : 10 10 12 10 12 11 A simple solution is to run two nested loops. We pick an outer element one by one. For
11 min read
Find closest smaller value for every element in array Given an array of integers, find the closest smaller element for every element. If there is no smaller element then print -1 Examples: Input : arr[] = {10, 5, 11, 6, 20, 12} Output : 6, -1, 10, 5, 12, 11 Input : arr[] = {10, 5, 11, 10, 20, 12} Output : 5 -1 10 5 12 11 A simple solution is to run two
4 min read
Find the nearest value present on the left of every array element Given an array arr[] of size N, the task is for each array element is to find the nearest non-equal value present on its left in the array. If no such element is found, then print -1 Examples: Input: arr[] = { 2, 1, 5, 8, 3 }Output: -1 2 2 5 2Explanation:[2], it is the only number in this prefix. He
8 min read
Floor of every element in same array Given an array of integers, find the closest smaller or same element for every element. If all elements are greater for an element, then print -1. We may assume that the array has at least two elements. Examples: Input : arr[] = {10, 5, 11, 10, 20, 12} Output : 10 -1 10 10 12 11 Note that there are
14 min read
Ceiling of every element in same array Given an array of integers arr[]. The task is to find the ceiling for each element in the array. The "ceiling" of an element is defined as the closest greater than or equal value present in the array (i.e., excluding the element itself). If no such element exists, return -1 for that position.Example
13 min read