Atrodiet masīvā nākamo mazāko vai nākamo lielāko

Ņ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 (n 2 ).

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  (  arr    next    order  )      {          // 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