logo

arr[] dizisinde abs(i - j) * min(arr[i], arr[j])'nin maksimum değerini bulun

N farklı öğeden oluşan bir dizi verildiğinde. Dizideki minimum iki sayının maksimum çarpımını ve konumlarının mutlak farkını bulun; yani abs(i - j) * min(arr[i] arr[j])'nin maksimum değerini bulun; burada i ve j, 0'dan n-1'e değişir. 

tip değişkenleri java

Örnekler:  

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 Maksimum değeri bul Deneyin!

A basit çözüm Bu problem için her bir elemanı tek tek alıp bu elemanı sağındaki elemanlarla karşılaştırmaktır. Daha sonra bunların minimumunu ve endeksleri arasındaki mutlak farkı hesaplayın ve sonucu maksimuma çıkarın. Bu yaklaşım için zaman karmaşıklığı O(n^2)'dir.



Bir verimli çözüm Problemi doğrusal zaman karmaşıklığında çözmek için. İki yineleyici alıyoruz Sol=0 Ve Sağ=n-1 arr[Left] ve arr[right] öğelerini karşılaştırın.  

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)

Aşağıda yukarıdaki fikrin uygulanması yer almaktadır. 

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(arrn);  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(arrn): # 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(arrn)) # 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> 

Çıkış
16

Zaman Karmaşıklığı : O(N log N) burada N Dizinin uzunluğudur.

Uzay Karmaşıklığı : O(1) fazladan alan kullanılmadığı için.

Bu nasıl çalışır?  
Yukarıdaki doğrusal algoritmada herhangi bir potansiyel çifti kaçırmadığımızı göstermemiz gereken önemli şey, yani sol++ veya sağdan yapmanın daha yüksek maxProduct değerine sahip olacağımız bir duruma yol açmadığını göstermemiz gerekir.

Lütfen her zaman (sağ - sol) ile çarptığımızı unutmayın. 

  1. Eğer varış[sol]< arr[right] then smaller values of Sağ mevcut sol için daha yüksek bir maxProduct değeri üretemedikleri için işe yaramazlar (çünkü arr[left] ile (right - left) ile çarpıyoruz. Peki ya arr[left] sol tarafındaki öğelerin herhangi birinden büyük olsaydı. Bu durumda o element için mevcut hakla daha iyi bir çift bulunmuş olmalıdır. Bu nedenle soldaki akımla daha iyi bir çifti kaçırmadan sola güvenle ulaşabiliriz.
  2. Benzer argümanlar arr[right] olduğunda da geçerlidir.< arr[left].