大小为 k 的子数组的最大乘积
给定一个由 n 个正整数和一个整数 k 组成的数组。找到大小为 k 的最大乘积子数组,即在 k <= n 的数组中找到 k 个连续元素的最大乘积。
例子 :
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}
方法1(简单:O(n * k))
一种朴素的方法是一个接一个地考虑所有大小为 k 的子数组。这种方法需要两个循环,因此复杂度为 O(n*k)。
方法2(效率:O(n))
如果我们有可用的前一个子数组的乘积,我们可以使用以下事实在 O(n) 中解决它,即大小为 k 的子数组的乘积可以在 O(1) 时间内计算出来。
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]
这样,我们只需一次遍历就可以计算出最大 k 个子数组的乘积。下面是这个想法的 C++ 实现。
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
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
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.
PHP
Javascript
输出:
4608
720
80