Find den maksimale værdi af abs(i - j) * min(arr[i], arr[j]) i en matrix arr[]

Givet en række af n forskellige elementer. Find maksimum for produktet af Minimum af to tal i matrixen og absolut forskel på deres positioner, dvs. find maksimumværdien af ​​abs(i - j) * min(arr[i] arr[j]), hvor i og j varierer fra 0 til n-1. 

Eksempler:  

Input : arr[] = {3 2 1 4} Output: 9 // arr[0] = 3 and arr[3] = 4 minimum of them is 3 and // absolute difference between their position is // abs(0-3) = 3. So product is 3*3 = 9 Input : arr[] = {8 1 9 4} Output: 16 // arr[0] = 8 and arr[2] = 9 minimum of them is 8 and // absolute difference between their position is // abs(0-2) = 2. So product is 8*2 = 16  
Recommended Practice Find maksimal værdi Prøv det!

EN enkel løsning for dette problem er at tage hvert element et efter et og sammenligne dette element med elementerne til højre for det. Beregn derefter produktet af minimum af dem og absolut forskel mellem deres indekser og maksimer resultatet. Tidskompleksiteten for denne tilgang er O(n^2).

An effektiv løsning at løse problemet i lineær tidskompleksitet. Vi tager to iteratorer Venstre=0 og Højre=n-1 sammenlign elementerne arr[Venstre] og arr[højre].  

left = 0 right = n-1 maxProduct = -INF While (left  < right) If arr[Left]  < arr[right] currProduct = arr[Left]*(right-Left) Left++ . If arr[right]  < arr[Left] currProduct = arr[Right]*(Right-Left) Right-- . maxProduct = max(maxProduct currProduct) 

Nedenfor er implementeringen af ​​ovenstående idé. 

C++
   // C++ implementation of code   #include       using     namespace     std  ;   // Function to calculate maximum value of    // abs(i - j) * min(arr[i] arr[j]) in arr[]   int     Maximum_Product  (  int     arr  []     int     n  )   {      int     maxProduct     =     INT_MIN  ;     // Initialize result      int     currProduct  ;     // product of current pair      // loop until they meet with each other      int     Left     =     0       right     =     n  -1  ;      while     (  Left      <     right  )      {      if     (  arr  [  Left  ]      <     arr  [  right  ])      {      currProduct     =     arr  [  Left  ]  *  (  right  -  Left  );      Left  ++  ;      }      else     // arr[right] is smaller      {      currProduct     =     arr  [  right  ]  *  (  right  -  Left  );      right  --  ;      }      // maximizing the product      maxProduct     =     max  (  maxProduct       currProduct  );      }      return     maxProduct  ;   }   // Driver program to test the case   int     main  ()   {      int     arr  []     =     {  8       1       9       4  };      int     n     =     sizeof  (  arr  )  /  sizeof  (  arr  [  0  ]);      cout      < <     Maximum_Product  (  arr    n  );      return     0  ;   }   
Java
   // Java implementation of code   import     java.util.*  ;   class   GFG     {          // Function to calculate maximum value of      // abs(i - j) * min(arr[i] arr[j]) in arr[]      static     int     Maximum_Product  (  int     arr  []       int     n  )     {          // Initialize result      int     maxProduct     =     Integer  .  MIN_VALUE  ;             // product of current pair      int     currProduct  ;         // loop until they meet with each other      int     Left     =     0       right     =     n     -     1  ;      while     (  Left      <     right  )     {      if     (  arr  [  Left  ]      <     arr  [  right  ]  )     {      currProduct     =     arr  [  Left  ]     *     (  right     -     Left  );      Left  ++  ;      }             // arr[right] is smaller      else         {      currProduct     =     arr  [  right  ]     *     (  right     -     Left  );      right  --  ;      }      // maximizing the product      maxProduct     =     Math  .  max  (  maxProduct       currProduct  );      }      return     maxProduct  ;   }   // Driver code   public     static     void     main  (  String  []     args  )      {      int     arr  []     =     {  8       1       9       4  };      int     n     =     arr  .  length  ;      System  .  out  .  print  (  Maximum_Product  (  arr       n  ));   }   }   // This code is contributed by Anant Agarwal.   
Python3
   # Python implementation of code   # Function to calculate   # maximum value of    # abs(i - j) * min(arr[i]   # arr[j]) in arr[]   def   Maximum_Product  (  arr    n  ):   # Initialize result   maxProduct   =   -  2147483648   # product of current pair   currProduct  =  0   # loop until they meet with each other   Left   =   0   right   =   n  -  1   while   (  Left    <   right  ):   if   (  arr  [  Left  ]    <   arr  [  right  ]):   currProduct   =   arr  [  Left  ]  *  (  right  -  Left  )   Left  +=  1   else  :   # arr[right] is smaller   currProduct   =   arr  [  right  ]  *  (  right  -  Left  )   right  -=  1   # maximizing the product   maxProduct   =   max  (  maxProduct     currProduct  )   return   maxProduct   # Driver code   arr   =   [  8     1     9     4  ]   n   =   len  (  arr  )   print  (  Maximum_Product  (  arr    n  ))   # This code is contributed   # by Anant Agarwal.   
C#
   // C# implementation of code   using     System  ;   class     GFG     {       // Function to calculate maximum   // value of abs(i - j) * min(arr[i]   // arr[j]) in arr[]   static     int     Maximum_Product  (  int     []  arr        int     n  )   {          // Initialize result      int     maxProduct     =     int  .  MinValue  ;             // product of current pair      int     currProduct  ;         // loop until they meet       // with each other      int     Left     =     0       right     =     n     -     1  ;      while     (  Left      <     right  )     {      if     (  arr  [  Left  ]      <     arr  [  right  ])      {      currProduct     =     arr  [  Left  ]     *         (  right     -     Left  );      Left  ++  ;      }             // arr[right] is smaller      else      {      currProduct     =     arr  [  right  ]     *      (  right     -     Left  );      right  --  ;      }      // maximizing the product      maxProduct     =     Math  .  Max  (  maxProduct           currProduct  );      }      return     maxProduct  ;   }   // Driver code   public     static     void     Main  ()      {      int     []  arr     =     {  8       1       9       4  };      int     n     =     arr  .  Length  ;      Console  .  Write  (  Maximum_Product  (  arr       n  ));   }   }   // This code is contributed by nitin mittal.   
PHP
      // PHP implementation of code   // Function to calculate    // maximum value of    // abs(i - j) * min(arr[i]    // arr[j]) in arr[]   function   Maximum_Product  (  $arr     $n  )   {   $INT_MIN   =   0  ;   // Initialize result   $maxProduct   =   $INT_MIN  ;   // product of current pair   $currProduct  ;   // loop until they meet   // with each other   $Left   =   0  ;   $right   =   $n   -   1  ;   while   (  $Left    <   $right  )   {   if   (  $arr  [  $Left  ]    <   $arr  [  $right  ])   {   $currProduct   =   $arr  [  $Left  ]   *   (  $right   -   $Left  );   $Left  ++  ;   }   // arr[right] is smaller   else   {   $currProduct   =   $arr  [  $right  ]   *   (  $right   -   $Left  );   $right  --  ;   }   // maximizing the product   $maxProduct   =   max  (  $maxProduct     $currProduct  );   }   return   $maxProduct  ;   }   // Driver Code   $arr   =   array  (  8     1     9     4  );   $n   =   sizeof  (  $arr  )   /   sizeof  (  $arr  [  0  ]);   echo   Maximum_Product  (  $arr     $n  );   // This code is contributed   // by nitin mittal.    ?>   
JavaScript
    <  script  >   // Javascript implementation of code   // Function to calculate   // maximum value of   // abs(i - j) * min(arr[i]   // arr[j]) in arr[]   function     Maximum_Product  (  arr       n  )   {      let     INT_MIN     =     0  ;      // Initialize result      let     maxProduct     =     INT_MIN  ;      // Product of current pair      let     currProduct  ;      // Loop until they meet      // with each other      let     Left     =     0       right     =     n     -     1  ;      while     (  Left      <     right  )         {      if     (  arr  [  Left  ]      <     arr  [  right  ])      {      currProduct     =     arr  [  Left  ]     *      (  right     -     Left  );      Left  ++  ;      }      // arr[right] is smaller      else         {      currProduct     =     arr  [  right  ]     *      (  right     -     Left  );      right  --  ;      }      // Maximizing the product      maxProduct     =     Math  .  max  (  maxProduct        currProduct  );      }      return     maxProduct  ;   }   // Driver Code   let     arr     =     new     Array  (  8       1       9       4  );   let     n     =     arr  .  length  ;   document  .  write  (  Maximum_Product  (  arr       n  ));   // This code is contributed by Saurabh Jaiswal    <  /script>   

Produktion
16 

Tidskompleksitet: O(N log N) her er N længden af ​​Array.

Rumkompleksitet: O(1) da der ikke bruges ekstra plads.

Hvordan virker dette?  
Det vigtige for at vise, at vi ikke går glip af noget potentielt par i ovenstående lineære algoritme, dvs. vi er nødt til at vise, at at gøre venstre++ eller højre-- ikke fører til et tilfælde, hvor vi ville have fået en højere værdi af maxProduct.

Bemærk, at vi altid gange med (højre - venstre). 

  1. Hvis arr[venstre] < arr[right] then smaller values of højre for nuværende venstre er ubrugelige, da de ikke kan producere højere værdi af maxProduct (fordi vi multiplicerer med arr[venstre] med (højre - venstre)). Hvad hvis arr[venstre] var større end nogen af ​​elementerne på dens venstre side. I så fald skal der være fundet et bedre par for det element med nuværende ret. Derfor kan vi roligt øge venstre uden at gå glip af noget bedre par med strøm til venstre.
  2. Lignende argumenter er anvendelige, når arr[right] < arr[left].