logo

Producte més gran d'un subarray de mida k

Prova-ho a GfG Practice ' title= #practiceLinkDiv { mostrar: cap !important; }

Donada una matriu formada per n nombres enters positius i un nombre enter k. Trobeu la subarray de productes més gran de mida k, és a dir, trobeu la producció màxima de k elements contigus a la matriu on k<= n.
Exemples:  

    Input:    arr[] = {1 5 9 8 2 4  
1 8 1 2}
k = 6
Output: 4608
The subarray is {9 8 2 4 1 8}
Input: arr[] = {1 5 9 8 2 4 1 8 1 2}
k = 4
Output: 720
The subarray is {5 9 8 2}
Input: arr[] = {2 5 8 1 1 3};
k = 3
Output: 80
The subarray is {2 5 8}
Recommended Practice El producte més gran Prova-ho!

Enfocament de força bruta:



Iterem sobre tots els subarrays de mida k utilitzant dos bucles imbricats. El bucle exterior va de 0 a n-k i el bucle interior va de i a i+k-1. Calculem el producte de cada subbarray i actualitzem el producte màxim trobat fins ara. Finalment retornem el màxim de producte.

Aquests són els passos per a l'enfocament anterior:

  1. Inicialitzeu una variable maxProduct a INT_MIN que representa el valor enter més petit possible.
  2. Itereu sobre tots els subarrays de mida k utilitzant dos bucles imbricats.
  3. El bucle exterior va de 0 a n-k.
  4. El bucle interior va des de i fins a i+k-1, on i és l'índex inicial del subbarray.
  5. Calculeu el producte del subbarray actual utilitzant el bucle intern.
  6. Si el producte és superior a maxProduct, actualitzeu maxProduct al producte actual.
  7. Retorna maxProduct com a resultat.

A continuació es mostra el codi de l'enfocament anterior:



C++
// C++ program to find the maximum product of a subarray // of size k. #include    using namespace std; // This function returns maximum product of a subarray // of size k in given array arr[0..n-1]. This function // assumes that k is smaller than or equal to n. int findMaxProduct(int arr[] int n int k) {  int maxProduct = INT_MIN;  for (int i = 0; i <= n - k; i++) {  int product = 1;  for (int j = i; j < i + k; j++) {  product *= arr[j];  }  maxProduct = max(maxProduct product);  }  return maxProduct; } // Driver code int main() {  int arr1[] = {1 5 9 8 2 4 1 8 1 2};  int k = 6;  int n = sizeof(arr1)/sizeof(arr1[0]);  cout << findMaxProduct(arr1 n k) << endl;  k = 4;  cout << findMaxProduct(arr1 n k) << endl;  int arr2[] = {2 5 8 1 1 3};  k = 3;  n = sizeof(arr2)/sizeof(arr2[0]);  cout << findMaxProduct(arr2 n k);  return 0; } 
Java
import java.util.Arrays; public class Main {  // This function returns the maximum product of a subarray of size k in the given array  // It assumes that k is smaller than or equal to the length of the array.  static int findMaxProduct(int[] arr int n int k) {  int maxProduct = Integer.MIN_VALUE;  for (int i = 0; i <= n - k; i++) {  int product = 1;  for (int j = i; j < i + k; j++) {  product *= arr[j];  }  maxProduct = Math.max(maxProduct product);  }  return maxProduct;  }  // Driver code  public static void main(String[] args) {  int[] arr1 = {1 5 9 8 2 4 1 8 1 2};  int k = 6;  int n = arr1.length;  System.out.println(findMaxProduct(arr1 n k));  k = 4;  System.out.println(findMaxProduct(arr1 n k));  int[] arr2 = {2 5 8 1 1 3};  k = 3;  n = arr2.length;  System.out.println(findMaxProduct(arr2 n k));  } } 
Python3
# Python Code def find_max_product(arr k): max_product = float('-inf') # Initialize max_product to negative infinity n = len(arr) # Get the length of the input array # Iterate through the array with a window of size k for i in range(n - k + 1): product = 1 # Initialize product to 1 for each subarray for j in range(i i + k): product *= arr[j] # Calculate the product of the subarray max_product = max(max_product product) # Update max_product if necessary return max_product # Return the maximum product of a subarray of size k # Driver code if __name__ == '__main__': arr1 = [1 5 9 8 2 4 1 8 1 2] k = 6 print(find_max_product(arr1 k)) # Output 25920 k = 4 print(find_max_product(arr1 k)) # Output 1728 arr2 = [2 5 8 1 1 3] k = 3 print(find_max_product(arr2 k)) # Output 80 # This code is contributed by guptapratik 
C#
using System; public class GFG {  // This function returns the maximum product of a subarray of size k in the given array  // It assumes that k is smaller than or equal to the length of the array.  static int FindMaxProduct(int[] arr int n int k)  {  int maxProduct = int.MinValue;  for (int i = 0; i <= n - k; i++)  {  int product = 1;  for (int j = i; j < i + k; j++)  {  product *= arr[j];  }  maxProduct = Math.Max(maxProduct product);  }  return maxProduct;  }  // Driver code  public static void Main(string[] args)  {  int[] arr1 = { 1 5 9 8 2 4 1 8 1 2 };  int k = 6;  int n = arr1.Length;  Console.WriteLine(FindMaxProduct(arr1 n k));  k = 4;  Console.WriteLine(FindMaxProduct(arr1 n k));  int[] arr2 = { 2 5 8 1 1 3 };  k = 3;  n = arr2.Length;  Console.WriteLine(FindMaxProduct(arr2 n k));  } } 
JavaScript
// This function returns the maximum product of a subarray of size k in the given array // It assumes that k is smaller than or equal to the length of the array. function findMaxProduct(arr k) {  let maxProduct = Number.MIN_VALUE;  const n = arr.length;  for (let i = 0; i <= n - k; i++) {  let product = 1;  for (let j = i; j < i + k; j++) {  product *= arr[j];  }  maxProduct = Math.max(maxProduct product);  }  return maxProduct; } // Driver code const arr1 = [1 5 9 8 2 4 1 8 1 2]; let k = 6; console.log(findMaxProduct(arr1 k)); k = 4; console.log(findMaxProduct(arr1 k)); const arr2 = [2 5 8 1 1 3]; k = 3; console.log(findMaxProduct(arr2 k)); 

Sortida
4608 720 80

Complexitat temporal: O(n*k) on n és la longitud de la matriu d'entrada i k és la mida de la subarray per a la qual estem trobant el producte màxim.
Espai auxiliar: O(1) perquè només estem utilitzant una quantitat constant d'espai addicional per emmagatzemar el producte màxim i el producte del subarray actual.

Mètode 2 (eficient: O(n))  
Podem resoldre'l en O(n) utilitzant el fet que el producte d'un subarray de mida k es pot calcular en el temps O(1) si tenim disponible el producte del subarray anterior. 
 

curr_product = (prev_product / arr[i-1]) * arr[i + k -1]  
prev_product : Product of subarray of size k beginning
with arr[i-1]
curr_product : Product of subarray of size k beginning
with arr[i]


D'aquesta manera podem calcular el producte de subarray de mida k màxima en un sol recorregut. A continuació es mostra la implementació C++ de la idea.



C++
// C++ program to find the maximum product of a subarray // of size k. #include    using namespace std; // This function returns maximum product of a subarray // of size k in given array arr[0..n-1]. This function // assumes that k is smaller than or equal to n. int findMaxProduct(int arr[] int n int k) {  // Initialize the MaxProduct to 1 as all elements  // in the array are positive  int MaxProduct = 1;  for (int i=0; i<k; i++)  MaxProduct *= arr[i];  int prev_product = MaxProduct;  // Consider every product beginning with arr[i]  // where i varies from 1 to n-k-1  for (int i=1; i<=n-k; i++)  {  int curr_product = (prev_product/arr[i-1]) *  arr[i+k-1];  MaxProduct = max(MaxProduct curr_product);  prev_product = curr_product;  }  // Return the maximum product found  return MaxProduct; } // Driver code int main() {  int arr1[] = {1 5 9 8 2 4 1 8 1 2};  int k = 6;  int n = sizeof(arr1)/sizeof(arr1[0]);  cout << findMaxProduct(arr1 n k) << endl;  k = 4;  cout << findMaxProduct(arr1 n k) << endl;  int arr2[] = {2 5 8 1 1 3};  k = 3;  n = sizeof(arr2)/sizeof(arr2[0]);  cout << findMaxProduct(arr2 n k);  return 0; } 
Java
// Java program to find the maximum product of a subarray // of size k import java.io.*; import java.util.*; class GFG  {  // Function returns maximum product of a subarray  // of size k in given array arr[0..n-1]. This function  // assumes that k is smaller than or equal to n.  static int findMaxProduct(int arr[] int n int k)  {  // Initialize the MaxProduct to 1 as all elements  // in the array are positive  int MaxProduct = 1;  for (int i=0; i<k; i++)  MaxProduct *= arr[i];    int prev_product = MaxProduct;    // Consider every product beginning with arr[i]  // where i varies from 1 to n-k-1  for (int i=1; i<=n-k; i++)  {  int curr_product = (prev_product/arr[i-1]) *  arr[i+k-1];  MaxProduct = Math.max(MaxProduct curr_product);  prev_product = curr_product;  }    // Return the maximum product found  return MaxProduct;  }    // driver program  public static void main (String[] args)   {  int arr1[] = {1 5 9 8 2 4 1 8 1 2};  int k = 6;  int n = arr1.length;  System.out.println(findMaxProduct(arr1 n k));    k = 4;  System.out.println(findMaxProduct(arr1 n k));    int arr2[] = {2 5 8 1 1 3};  k = 3;  n = arr2.length;  System.out.println(findMaxProduct(arr2 n k));  } } // This code is contributed by Pramod Kumar 
Python3
# Python 3 program to find the maximum  # product of a subarray of size k. # This function returns maximum product  # of a subarray of size k in given array # arr[0..n-1]. This function assumes  # that k is smaller than or equal to n. def findMaxProduct(arr n k) : # Initialize the MaxProduct to 1  # as all elements in the array  # are positive MaxProduct = 1 for i in range(0 k) : MaxProduct = MaxProduct * arr[i] prev_product = MaxProduct # Consider every product beginning # with arr[i] where i varies from # 1 to n-k-1 for i in range(1 n - k + 1) : curr_product = (prev_product // arr[i-1]) * arr[i+k-1] MaxProduct = max(MaxProduct curr_product) prev_product = curr_product # Return the maximum product found return MaxProduct # Driver code arr1 = [1 5 9 8 2 4 1 8 1 2] k = 6 n = len(arr1) print (findMaxProduct(arr1 n k) ) k = 4 print (findMaxProduct(arr1 n k)) arr2 = [2 5 8 1 1 3] k = 3 n = len(arr2) print(findMaxProduct(arr2 n k)) # This code is contributed by Nikita Tiwari. 
C#
// C# program to find the maximum  // product of a subarray of size k using System; class GFG  {  // Function returns maximum   // product of a subarray of   // size k in given array   // arr[0..n-1]. This function   // assumes that k is smaller   // than or equal to n.  static int findMaxProduct(int []arr   int n int k)  {  // Initialize the MaxProduct   // to 1 as all elements  // in the array are positive  int MaxProduct = 1;  for (int i = 0; i < k; i++)  MaxProduct *= arr[i];  int prev_product = MaxProduct;  // Consider every product beginning   // with arr[i] where i varies from   // 1 to n-k-1  for (int i = 1; i <= n - k; i++)  {  int curr_product = (prev_product /   arr[i - 1]) *   arr[i + k - 1];  MaxProduct = Math.Max(MaxProduct   curr_product);  prev_product = curr_product;  }  // Return the maximum  // product found  return MaxProduct;  }    // Driver Code  public static void Main ()   {  int []arr1 = {1 5 9 8 2   4 1 8 1 2};  int k = 6;  int n = arr1.Length;  Console.WriteLine(findMaxProduct(arr1 n k));  k = 4;  Console.WriteLine(findMaxProduct(arr1 n k));  int []arr2 = {2 5 8 1 1 3};  k = 3;  n = arr2.Length;  Console.WriteLine(findMaxProduct(arr2 n k));  } } // This code is contributed by anuj_67. 
JavaScript
<script>  // JavaScript program to find the maximum   // product of a subarray of size k    // Function returns maximum   // product of a subarray of   // size k in given array   // arr[0..n-1]. This function   // assumes that k is smaller   // than or equal to n.  function findMaxProduct(arr n k)  {  // Initialize the MaxProduct   // to 1 as all elements  // in the array are positive  let MaxProduct = 1;  for (let i = 0; i < k; i++)  MaxProduct *= arr[i];    let prev_product = MaxProduct;    // Consider every product beginning   // with arr[i] where i varies from   // 1 to n-k-1  for (let i = 1; i <= n - k; i++)  {  let curr_product =   (prev_product / arr[i - 1]) * arr[i + k - 1];  MaxProduct = Math.max(MaxProduct curr_product);  prev_product = curr_product;  }    // Return the maximum  // product found  return MaxProduct;  }    let arr1 = [1 5 9 8 2 4 1 8 1 2];  let k = 6;  let n = arr1.length;  document.write(findMaxProduct(arr1 n k) + '
'
); k = 4; document.write(findMaxProduct(arr1 n k) + '
'
); let arr2 = [2 5 8 1 1 3]; k = 3; n = arr2.length; document.write(findMaxProduct(arr2 n k) + '
'
); </script>
PHP
 // PHP program to find the maximum  // product of a subarray of size k. // This function returns maximum  // product of a subarray of size  // k in given array arr[0..n-1]. // This function assumes that k  // is smaller than or equal to n. function findMaxProduct( $arr $n $k) { // Initialize the MaxProduct to // 1 as all elements // in the array are positive $MaxProduct = 1; for($i = 0; $i < $k; $i++) $MaxProduct *= $arr[$i]; $prev_product = $MaxProduct; // Consider every product // beginning with arr[i] // where i varies from 1  // to n-k-1 for($i = 1; $i < $n - $k; $i++) { $curr_product = ($prev_product / $arr[$i - 1]) * $arr[$i + $k - 1]; $MaxProduct = max($MaxProduct $curr_product); $prev_product = $curr_product; } // Return the maximum // product found return $MaxProduct; } // Driver code $arr1 = array(1 5 9 8 2 4 1 8 1 2); $k = 6; $n = count($arr1); echo findMaxProduct($arr1 $n $k)'n' ; $k = 4; echo findMaxProduct($arr1 $n $k)'n'; $arr2 = array(2 5 8 1 1 3); $k = 3; $n = count($arr2); echo findMaxProduct($arr2 $n $k); // This code is contributed by anuj_67. ?> 

Sortida
4608 720 80

Espai auxiliar: O(1) ja que no s'utilitza cap espai addicional.
Aquest article és contribuït per Ashutosh Kumar .