Dată o matrice de n elemente distincte. Găsiți produsul maxim al lui Minim a două numere din matrice și diferența absolută a pozițiilor lor, adică găsiți valoarea maximă a abs(i - j) * min(arr[i] arr[j]) unde i și j variază de la 0 la n-1.
variabila bash
Exemple:
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 Găsiți valoarea maximă Încearcă! O solutie simpla deoarece această problemă este de a lua fiecare element unul câte unul și de a compara acest element cu elementele din dreapta lui. Apoi calculați produsul minim al acestora și diferența absolută dintre indicii lor și maximizați rezultatul. Complexitatea timpului pentru această abordare este O(n^2).
Un solutie eficienta pentru a rezolva problema în complexitate liniară de timp. Luăm doi iteratoare Stânga=0 şi Dreapta=n-1 comparați elementele arr[Left] și arr[right].
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)
Mai jos este implementarea ideii de mai sus.
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>
Ieșire
16
Complexitatea timpului: O(N log N) aici N este lungimea Array.
Complexitatea spațiului: O(1) deoarece nu este folosit spațiu suplimentar.
Cum funcţionează asta?
Lucrul important să arătăm că nu pierdem nicio pereche potențială în algoritmul liniar de mai sus, adică trebuie să arătăm că a face stânga++ sau dreapta -- nu duce la un caz în care am fi obținut o valoare mai mare a maxProduct.
Vă rugăm să rețineți că înmulțim întotdeauna cu (dreapta - stânga).
- Dacă arr[stânga]< arr[right] then smaller values of corect pentru curent stânga sunt inutile, deoarece nu pot produce o valoare mai mare a maxProduct (pentru că înmulțim cu arr[left] cu (dreapta - stânga)). Ce se întâmplă dacă arr[left] ar fi mai mare decât oricare dintre elementele din partea stângă. În acest caz, o pereche mai bună pentru acel element trebuie să fi fost găsită cu dreptul curent. Prin urmare, putem crește în siguranță stânga fără a rata nicio pereche mai bună cu curentul stâng.
- Argumente similare sunt aplicabile atunci când arr[right]< arr[left].