Ņemot vērā veselu skaitļu masīvu, atrodiet nākamais mazāks no nākamais lielākais elements katram masīva elementam.
Piezīme : Elementi, kuriem nepastāv lielāks elements vai nav mazāks no lielāka elementa, drukāt -1.
Piemēri:
Input : arr[] = {5 1 9 2 5 1 7} Output: 2 2 -1 1 -1 -1 -1 Explanation : Next Greater -> Right Smaller 5 -> 9 9 -> 2 1 -> 9 9 -> 2 9 -> -1 -1 -> -1 2 -> 5 5 -> 1 5 -> 7 7 -> -1 1 -> 7 7 -> -1 7 -> -1 -1 -> -1 Input : arr[] = {4 8 2 1 9 5 6 3} Output : 2 5 5 5 -1 3 -1 -1 A vienkāršs risinājums ir atkārtot visus elementus. Katram elementam atrodiet nākamo lielāko pašreizējā elementa elementu un pēc tam atrodiet pareizo mazāko elementu pašreizējam nākamajam lielākajam elementam.
Kods-
C++// C++ Program to find Right smaller element of next // greater element #include using namespace std; // Function to find Right smaller element of next greater // element void nextSmallerOfNextGreater(int arr[] int n) { vector<int> vec; //For 1st n-1 elements of vector for(int i=0;i<n-1;i++){ int temp=arr[i]; int next=-1; int ans=-1; for(int j=i+1;j<n;j++){ if(arr[j]>temp){ next=j; break; } } if(next==-1){vec.push_back(-1);} else{ for(int j=next+1;j<n;j++){ if(arr[j]<arr[next]){ ans=j; break; } } if(ans==-1){vec.push_back(-1);} else{vec.push_back(arr[ans]);} } } vec.push_back(-1);//For last element of vector for(auto x: vec){ cout<<x<<' '; } cout<<endl; } // Driver program int main() { int arr[] = {5 1 9 2 5 1 7}; int n = sizeof(arr)/sizeof(arr[0]); nextSmallerOfNextGreater(arr n); return 0; }
Java // Java Program to find Right smaller element of next // greater element import java.util.*; public class Main { // Function to find Right smaller element of next greater element static void nextSmallerOfNextGreater(int arr[] int n) { ArrayList<Integer> vec = new ArrayList<Integer>(); // For 1st n-1 elements of vector for(int i = 0; i < n - 1; i++) { int temp = arr[i]; int next = -1; int ans = -1; for(int j = i + 1; j < n; j++) { if(arr[j] > temp) { next = j; break; } } if(next == -1) { vec.add(-1); } else { for(int j = next + 1; j < n; j++) { if(arr[j] < arr[next]) { ans = j; break; } } if(ans == -1) { vec.add(-1); } else { vec.add(arr[ans]); } } } vec.add(-1); // For last element of vector for(int x : vec) { System.out.print(x + ' '); } System.out.println(); } // Driver program public static void main(String[] args) { int arr[] = {5 1 9 2 5 1 7}; int n = arr.length; nextSmallerOfNextGreater(arr n); } }
Python3 # Function to find Right smaller element of next greater element def nextSmallerOfNextGreater(arr n): vec = [] # For 1st n-1 elements of vector for i in range(n-1): temp = arr[i] next = -1 ans = -1 for j in range(i+1 n): if arr[j] > temp: next = j break if next == -1: vec.append(-1) else: for j in range(next+1 n): if arr[j] < arr[next]: ans = j break if ans == -1: vec.append(-1) else: vec.append(arr[ans]) vec.append(-1) # For last element of vector for x in vec: print(x end=' ') print() # Driver program arr = [5 1 9 2 5 1 7] n = len(arr) nextSmallerOfNextGreater(arr n)
C# using System; using System.Collections.Generic; public class MainClass { // Function to find Right smaller element of next // greater element static void nextSmallerOfNextGreater(int[] arr int n) { List<int> vec = new List<int>(); // For 1st n-1 elements of vector for (int i = 0; i < n - 1; i++) { int temp = arr[i]; int next = -1; int ans = -1; for (int j = i + 1; j < n; j++) { if (arr[j] > temp) { next = j; break; } } if (next == -1) { vec.Add(-1); } else { for (int j = next + 1; j < n; j++) { if (arr[j] < arr[next]) { ans = j; break; } } if (ans == -1) { vec.Add(-1); } else { vec.Add(arr[ans]); } } } vec.Add(-1); // For last element of vector foreach(var x in vec) { Console.Write(x + ' '); } Console.WriteLine(); } // Driver program public static void Main() { int[] arr = { 5 1 9 2 5 1 7 }; int n = arr.Length; nextSmallerOfNextGreater(arr n); } }
JavaScript // Function to find Right smaller element of next greater element function nextSmallerOfNextGreater(arr n) { let vec = []; // For 1st n-1 elements of vector for (let i = 0; i < n - 1; i++) { let temp = arr[i]; let next = -1; let ans = -1; for (let j = i + 1; j < n; j++) { if (arr[j] > temp) { next = j; break; } } if (next == -1) { vec.push(-1); } else { for (let j = next + 1; j < n; j++) { if (arr[j] < arr[next]) { ans = j; break; } } if (ans == -1) { vec.push(-1); } else { vec.push(arr[ans]); } } } vec.push(-1); // For last element of vector for (let x of vec) { process.stdout.write(x + ' '); } console.log(); } // Driver program let arr = [5 1 9 2 5 1 7]; let n = arr.length; nextSmallerOfNextGreater(arr n);
Izvade
2 2 -1 1 -1 -1 -1
Laika sarežģītība no šī risinājuma ir O (n2).
Kosmosa sarežģītība: O(1)
An efektīvs risinājums aizņem O(n) laiku. Ievērojiet, ka tā ir kombinācija Nākamais lielākais elements & nākamais mazākais elements masīvā.
Let input array be 'arr[]' and size of array be 'n' find next greatest element of every element step 1 : Create an empty stack (S) in which we store the indexes and NG[] that is user to store the indexes of NGE of every element. step 2 : Traverse the array in reverse order where i goes from (n-1 to 0) a) While S is non empty and the top element of S is smaller than or equal to 'arr[i]': pop S b) If S is empty arr[i] has no greater element NG[i] = -1 c) else we have next greater element NG[i] = S.top() // here we store the index of NGE d) push current element index in stack S.push(i) Find Right smaller element of every element step 3 : create an array RS[] used to store the index of right smallest element step 4 : we repeat step (1 & 2) with little bit of modification in step 1 & 2 . they are : a). we use RS[] in place of NG[]. b). In step (2.a) we pop element form stack S while S is not empty or the top element of S is greater than or equal to 'arr[i]' step 5 : compute all RSE of NGE : where i goes from 0 to n-1 if NG[ i ] != -1 && RS[ NG [ i]] ! =-1 print arr[RS[NG[i]]] else print -1
Zemāk ir iepriekš minētās idejas īstenošana
C++// C++ Program to find Right smaller element of next // greater element #include using namespace std; // function find Next greater element void nextGreater(int arr[] int n int next[] char order) { // create empty stack stack<int> S; // Traverse all array elements in reverse order // order == 'G' we compute next greater elements of // every element // order == 'S' we compute right smaller element of // every element for (int i=n-1; i>=0; i--) { // Keep removing top element from S while the top // element is smaller than or equal to arr[i] (if Key is G) // element is greater than or equal to arr[i] (if order is S) while (!S.empty() && ((order=='G')? arr[S.top()] <= arr[i]: arr[S.top()] >= arr[i])) S.pop(); // store the next greater element of current element if (!S.empty()) next[i] = S.top(); // If all elements in S were smaller than arr[i] else next[i] = -1; // Push this element S.push(i); } } // Function to find Right smaller element of next greater // element void nextSmallerOfNextGreater(int arr[] int n) { int NG[n]; // stores indexes of next greater elements int RS[n]; // stores indexes of right smaller elements // Find next greater element // Here G indicate next greater element nextGreater(arr n NG 'G'); // Find right smaller element // using same function nextGreater() // Here S indicate right smaller elements nextGreater(arr n RS 'S'); // If NG[i] == -1 then there is no smaller element // on right side. We can find Right smaller of next // greater by arr[RS[NG[i]]] for (int i=0; i< n; i++) { if (NG[i] != -1 && RS[NG[i]] != -1) cout << arr[RS[NG[i]]] << ' '; else cout<<'-1'<<' '; } } // Driver program int main() { int arr[] = {5 1 9 2 5 1 7}; int n = sizeof(arr)/sizeof(arr[0]); nextSmallerOfNextGreater(arr n); return 0; }
Java // Java Program to find Right smaller element of next // greater element import java.util.Stack; public class Main { // function find Next greater element public static void nextGreater(int arr[] int next[] char order) { // create empty stack Stack<Integer> stack=new Stack<>(); // Traverse all array elements in reverse order // order == 'G' we compute next greater elements of // every element // order == 'S' we compute right smaller element of // every element for (int i=arr.length-1; i>=0; i--) { // Keep removing top element from S while the top // element is smaller than or equal to arr[i] (if Key is G) // element is greater than or equal to arr[i] (if order is S) while (!stack.isEmpty() && ((order=='G')? arr[stack.peek()] <= arr[i]:arr[stack.peek()] >= arr[i])) stack.pop(); // store the next greater element of current element if (!stack.isEmpty()) next[i] = stack.peek(); // If all elements in S were smaller than arr[i] else next[i] = -1; // Push this element stack.push(i); } } // Function to find Right smaller element of next greater // element public static void nextSmallerOfNextGreater(int arr[]) { int NG[]=new int[arr.length]; // stores indexes of next greater elements int RS[]=new int[arr.length]; // stores indexes of right smaller elements // Find next greater element // Here G indicate next greater element nextGreater(arr NG 'G'); // Find right smaller element // using same function nextGreater() // Here S indicate right smaller elements nextGreater(arr RS 'S'); // If NG[i] == -1 then there is no smaller element // on right side. We can find Right smaller of next // greater by arr[RS[NG[i]]] for (int i=0; i< arr.length; i++) { if (NG[i] != -1 && RS[NG[i]] != -1) System.out.print(arr[RS[NG[i]]]+' '); else System.out.print('-1 '); } } public static void main(String args[]) { int arr[] = {5 1 9 2 5 1 7}; nextSmallerOfNextGreater(arr); } } //This code is contributed by Gaurav Tiwari
Python 3 # Python 3 Program to find Right smaller element of next # greater element # function find Next greater element def nextGreater(arr n next order): S = [] # Traverse all array elements in reverse order # order == 'G' we compute next greater elements of # every element # order == 'S' we compute right smaller element of # every element for i in range(n-1-1-1): # Keep removing top element from S while the top # element is smaller than or equal to arr[i] (if Key is G) # element is greater than or equal to arr[i] (if order is S) while (S!=[] and (arr[S[len(S)-1]] <= arr[i] if (order=='G') else arr[S[len(S)-1]] >= arr[i] )): S.pop() # store the next greater element of current element if (S!=[]): next[i] = S[len(S)-1] # If all elements in S were smaller than arr[i] else: next[i] = -1 # Push this element S.append(i) # Function to find Right smaller element of next greater # element def nextSmallerOfNextGreater(arr n): NG = [None]*n # stores indexes of next greater elements RS = [None]*n # stores indexes of right smaller elements # Find next greater element # Here G indicate next greater element nextGreater(arr n NG 'G') # Find right smaller element # using same function nextGreater() # Here S indicate right smaller elements nextGreater(arr n RS 'S') # If NG[i] == -1 then there is no smaller element # on right side. We can find Right smaller of next # greater by arr[RS[NG[i]]] for i in range(n): if (NG[i] != -1 and RS[NG[i]] != -1): print(arr[RS[NG[i]]]end=' ') else: print('-1'end=' ') # Driver program if __name__=='__main__': arr = [5 1 9 2 5 1 7] n = len(arr) nextSmallerOfNextGreater(arr n) # this code is contributed by ChitraNayal
C# using System; using System.Collections.Generic; // C# Program to find Right smaller element of next // greater element public class GFG { // function find Next greater element public static void nextGreater(int []arr int []next char order) { // create empty stack Stack<int> stack=new Stack<int>(); // Traverse all array elements in reverse order // order == 'G' we compute next greater elements of // every element // order == 'S' we compute right smaller element of // every element for (int i=arr.Length-1; i>=0; i--) { // Keep removing top element from S while the top // element is smaller than or equal to arr[i] (if Key is G) // element is greater than or equal to arr[i] (if order is S) while (stack.Count!=0 && ((order=='G')? arr[stack.Peek()] <= arr[i]:arr[stack.Peek()] >= arr[i])) stack.Pop(); // store the next greater element of current element if (stack.Count!=0) next[i] = stack.Peek(); // If all elements in S were smaller than arr[i] else next[i] = -1; // Push this element stack.Push(i); } } // Function to find Right smaller element of next greater // element public static void nextSmallerOfNextGreater(int []arr) { int []NG=new int[arr.Length]; // stores indexes of next greater elements int []RS=new int[arr.Length]; // stores indexes of right smaller elements // Find next greater element // Here G indicate next greater element nextGreater(arr NG 'G'); // Find right smaller element // using same function nextGreater() // Here S indicate right smaller elements nextGreater(arr RS 'S'); // If NG[i] == -1 then there is no smaller element // on right side. We can find Right smaller of next // greater by arr[RS[NG[i]]] for (int i=0; i< arr.Length; i++) { if (NG[i] != -1 && RS[NG[i]] != -1) Console.Write(arr[RS[NG[i]]]+' '); else Console.Write('-1 '); } } public static void Main() { int []arr = {5 1 9 2 5 1 7}; nextSmallerOfNextGreater(arr); } } // This code is contributed by PrinciRaj1992
JavaScript <script> // Javascript Program to find Right smaller element of next // greater element // function find Next greater element function nextGreater(arrnextorder) { // create empty stack let stack = []; // Traverse all array elements in reverse order // order == 'G' we compute next greater elements of // every element // order == 'S' we compute right smaller element of // every element for (let i = arr.length - 1; i >= 0; i--) { // Keep removing top element from S while the top // element is smaller than or equal to arr[i] (if Key is G) // element is greater than or equal to arr[i] (if order is S) while (stack.length!=0 && ((order=='G')? arr[stack[stack.length-1]] <= arr[i] : arr[stack[stack.length-1]] >= arr[i])) stack.pop(); // store the next greater element of current element if (stack.length != 0) next[i] = stack[stack.length - 1]; // If all elements in S were smaller than arr[i] else next[i] = -1; // Push this element stack.push(i); } } // Function to find Right smaller element of next greater // element function nextSmallerOfNextGreater(arr) { let NG = new Array(arr.length); // stores indexes of next greater elements let RS = new Array(arr.length); // stores indexes of right smaller elements for(let i = 0; i < arr.length; i++) { NG[i] = 0; RS[i] = 0; } // Find next greater element // Here G indicate next greater element nextGreater(arr NG 'G'); // Find right smaller element // using same function nextGreater() // Here S indicate right smaller elements nextGreater(arr RS 'S'); // If NG[i] == -1 then there is no smaller element // on right side. We can find Right smaller of next // greater by arr[RS[NG[i]]] for (let i = 0; i < arr.length; i++) { if (NG[i] != -1 && RS[NG[i]] != -1) document.write(arr[RS[NG[i]]] + ' '); else document.write('-1 '); } } // Driver code let arr = [5 1 9 2 5 1 7]; nextSmallerOfNextGreater(arr); // This code is contributed by rag2127 </script>
Izvade
2 2 -1 1 -1 -1 -1
Laika sarežģītība: O(n) kur n ir dotā masīva lielums.
Palīgtelpa: O(n ) kur n ir dotā masīva lielums.
Izveidojiet viktorīnu