找到 k 长度的最大平均子数组
给定一个具有正数和负数的数组,找到给定长度的最大平均子数组。
例子:
Input: arr[] = {1, 12, -5, -6, 50, 3}, k = 4
Output: Maximum average subarray of length 4 begins
at index 1.
Maximum average is (12 - 5 - 6 + 50)/4 = 51/4
一个简单的解决方案是运行两个循环。外循环选择起点,内循环从起点一直到长度“k”并计算元素的平均值。该解决方案的时间复杂度为 O(n*k)。
更好的解决方案是创建一个大小为 n 的辅助数组。在此数组中存储元素的累积总和。设数组为 csum[]。 csum[i] 存储从 arr[0] 到 arr[i] 的元素总和。一旦我们有了 csum[] 数组,我们就可以在 O(1) 时间内计算两个索引之间的总和。
下面是这个想法的实现。一个观察结果是,如果给定长度的子数组具有最大和,则它具有最大平均值。所以我们可以通过比较和来避免浮点运算。
C++
// C++ program to find maximum average subarray
// of given length.
#include
using namespace std;
// Returns beginning index of maximum average
// subarray of length 'k'
int findMaxAverage(int arr[], int n, int k)
{
// Check if 'k' is valid
if (k > n)
return -1;
// Create and fill array to store cumulative
// sum. csum[i] stores sum of arr[0] to arr[i]
int *csum = new int[n];
csum[0] = arr[0];
for (int i=1; i max_sum)
{
max_sum = curr_sum;
max_end = i;
}
}
delete [] csum; // To avoid memory leak
// Return starting index
return max_end - k + 1;
}
// Driver program
int main()
{
int arr[] = {1, 12, -5, -6, 50, 3};
int k = 4;
int n = sizeof(arr)/sizeof(arr[0]);
cout << "The maximum average subarray of "
"length "<< k << " begins at index "
<< findMaxAverage(arr, n, k);
return 0;
}
Java
// Java program to find maximum average
// subarray of given length.
import java .io.*;
class GFG {
// Returns beginning index
// of maximum average
// subarray of length 'k'
static int findMaxAverage(int []arr,
int n, int k)
{
// Check if 'k' is valid
if (k > n)
return -1;
// Create and fill array
// to store cumulative
// sum. csum[i] stores
// sum of arr[0] to arr[i]
int []csum = new int[n];
csum[0] = arr[0];
for (int i = 1; i < n; i++)
csum[i] = csum[i - 1] + arr[i];
// Initialize max_sm as
// sum of first subarray
int max_sum = csum[k - 1],
max_end = k - 1;
// Find sum of other
// subarrays and update
// max_sum if required.
for (int i = k; i < n; i++)
{
int curr_sum = csum[i] -
csum[i - k];
if (curr_sum > max_sum)
{
max_sum = curr_sum;
max_end = i;
}
}
// To avoid memory leak
//delete [] csum;
// Return starting index
return max_end - k + 1;
}
// Driver Code
static public void main (String[] args)
{
int []arr = {1, 12, -5, -6, 50, 3};
int k = 4;
int n = arr.length;
System.out.println("The maximum "
+ "average subarray of length "
+ k + " begins at index "
+ findMaxAverage(arr, n, k));
}
}
// This code is contributed by anuj_67.
Python3
# Python program to find maximum average subarray
# of given length.
# Returns beginning index of maximum average
# subarray of length 'k'
def findMaxAverage(arr, n, k):
# Check if 'k' is valid
if k > n:
return -1
# Create and fill array to store cumulative
# sum. csum[i] stores sum of arr[0] to arr[i]
csum = [0]*n
csum[0] = arr[0]
for i in range(1, n):
csum[i] = csum[i-1] + arr[i];
# Initialize max_sm as sum of first subarray
max_sum = csum[k-1]
max_end = k-1
# Find sum of other subarrays and update
# max_sum if required.
for i in range(k, n):
curr_sum = csum[i] - csum[i-k]
if curr_sum > max_sum:
max_sum = curr_sum
max_end = i
# Return starting index
return max_end - k + 1
# Driver program
arr = [1, 12, -5, -6, 50, 3]
k = 4
n = len(arr)
print("The maximum average subarray of length",k,
"begins at index",findMaxAverage(arr, n, k))
#This code is contributed by
#Smitha Dinesh Semwal
C#
// C# program to find maximum average
// subarray of given length.
using System;
class GFG{
// Returns beginning index
// of maximum average
// subarray of length 'k'
static int findMaxAverage(int []arr,
int n, int k)
{
// Check if 'k' is valid
if (k > n)
return -1;
// Create and fill array
// to store cumulative
// sum. csum[i] stores
// sum of arr[0] to arr[i]
int []csum = new int[n];
csum[0] = arr[0];
for (int i = 1; i < n; i++)
csum[i] = csum[i - 1] + arr[i];
// Initialize max_sm as
// sum of first subarray
int max_sum = csum[k - 1],
max_end = k - 1;
// Find sum of other
// subarrays and update
// max_sum if required.
for (int i = k; i < n; i++)
{
int curr_sum = csum[i] -
csum[i - k];
if (curr_sum > max_sum)
{
max_sum = curr_sum;
max_end = i;
}
}
// To avoid memory leak
//delete [] csum;
// Return starting index
return max_end - k + 1;
}
// Driver Code
static public void Main ()
{
int []arr = {1, 12, -5, -6, 50, 3};
int k = 4;
int n = arr.Length;
Console.WriteLine("The maximum average subarray of "+
"length "+ k + " begins at index "
+ findMaxAverage(arr, n, k));
}
}
// This code is contributed by anuj_67.
PHP
$n)
return -1;
// Create and fill array to
// store cumulative sum.
// csum[i] stores sum of
// arr[0] to arr[i]
$csum = array();
$csum[0] = $arr[0];
for($i = 1; $i < $n; $i++)
$csum[$i] = $csum[$i - 1] +
$arr[$i];
// Initialize max_sm as sum
// of first subarray
$max_sum = $csum[$k - 1];
$max_end = $k - 1;
// Find sum of other subarrays
// and update max_sum if required.
for($i = $k; $i < $n; $i++)
{
$curr_sum = $csum[$i] -
$csum[$i - $k];
if ($curr_sum > $max_sum)
{
$max_sum = $curr_sum;
$max_end = $i;
}
}
// Return starting index
return $max_end - $k + 1;
}
// Driver Code
$arr = array(1, 12, -5, -6, 50, 3);
$k = 4;
$n = count($arr);
echo "The maximum average subarray of "
,"length ", $k , " begins at index "
, findMaxAverage($arr, $n, $k);
// This code is contributed by anuj_67.
?>
Javascript
C++
// C++ program to find maximum average subarray
// of given length.
#include
using namespace std;
// Returns beginning index of maximum average
// subarray of length 'k'
int findMaxAverage(int arr[], int n, int k)
{
// Check if 'k' is valid
if (k > n)
return -1;
// Compute sum of first 'k' elements
int sum = arr[0];
for (int i=1; i max_sum)
{
max_sum = sum;
max_end = i;
}
}
// Return starting index
return max_end - k + 1;
}
// Driver program
int main()
{
int arr[] = {1, 12, -5, -6, 50, 3};
int k = 4;
int n = sizeof(arr)/sizeof(arr[0]);
cout << "The maximum average subarray of "
"length "<< k << " begins at index "
<< findMaxAverage(arr, n, k);
return 0;
}
Java
// Java program to find maximum average subarray
// of given length.
import java.io.*;
class GFG {
// Returns beginning index of maximum average
// subarray of length 'k'
static int findMaxAverage(int arr[], int n, int k)
{
// Check if 'k' is valid
if (k > n)
return -1;
// Compute sum of first 'k' elements
int sum = arr[0];
for (int i = 1; i < k; i++)
sum += arr[i];
int max_sum = sum, max_end = k-1;
// Compute sum of remaining subarrays
for (int i = k; i < n; i++)
{
sum = sum + arr[i] - arr[i-k];
if (sum > max_sum)
{
max_sum = sum;
max_end = i;
}
}
// Return starting index
return max_end - k + 1;
}
// Driver program
public static void main (String[] args)
{
int arr[] = {1, 12, -5, -6, 50, 3};
int k = 4;
int n = arr.length;
System.out.println( "The maximum average"
+ " subarray of length " + k
+ " begins at index "
+ findMaxAverage(arr, n, k));
}
}
// This code is contributed by anuj_67.
Python3
# Python 3 program to find maximum
# average subarray of given length.
# Returns beginning index of maximum
# average subarray of length 'k'
def findMaxAverage(arr, n, k):
# Check if 'k' is valid
if (k > n):
return -1
# Compute sum of first 'k' elements
sum = arr[0]
for i in range(1, k):
sum += arr[i]
max_sum = sum
max_end = k - 1
# Compute sum of remaining subarrays
for i in range(k, n):
sum = sum + arr[i] - arr[i - k]
if (sum > max_sum):
max_sum = sum
max_end = i
# Return starting index
return max_end - k + 1
# Driver program
arr = [1, 12, -5, -6, 50, 3]
k = 4
n = len(arr)
print("The maximum average subarray of length", k,
"begins at index",
findMaxAverage(arr, n, k))
# This code is contributed by
# Smitha Dinesh Semwal
C#
// C# program to find maximum average
// subarray of given length.
using System;
class GFG {
// Returns beginning index of
// maximum average subarray of
// length 'k'
static int findMaxAverage(int []arr,
int n, int k)
{
// Check if 'k' is valid
if (k > n)
return -1;
// Compute sum of first 'k'
// elements
int sum = arr[0];
for (int i = 1; i < k; i++)
sum += arr[i];
int max_sum = sum;
int max_end = k-1;
// Compute sum of remaining
// subarrays
for (int i = k; i < n; i++)
{
sum = sum + arr[i] - arr[i-k];
if (sum > max_sum)
{
max_sum = sum;
max_end = i;
}
}
// Return starting index
return max_end - k + 1;
}
// Driver program
public static void Main ()
{
int []arr = {1, 12, -5, -6, 50, 3};
int k = 4;
int n = arr.Length;
Console.WriteLine( "The maximum "
+ "average subarray of length "
+ k + " begins at index "
+ findMaxAverage(arr, n, k));
}
}
// This code is contributed by anuj_67.
PHP
$n)
return -1;
// Compute sum of first
// 'k' elements
$sum = $arr[0];
for($i = 1; $i < $k; $i++)
$sum += $arr[$i];
$max_sum = $sum;
$max_end = $k-1;
// Compute sum of
// remaining subarrays
for($i = $k; $i < $n; $i++)
{
$sum = $sum + $arr[$i] -
$arr[$i - $k];
if ($sum > $max_sum)
{
$max_sum = $sum;
$max_end = $i;
}
}
// Return starting index
return $max_end - $k + 1;
}
// Driver Code
$arr = array(1, 12, -5, -6, 50, 3);
$k = 4;
$n = count($arr);
echo "The maximum average subarray of ",
"length ", $k , " begins at index "
, findMaxAverage($arr, $n, $k);
// This code is contributed by anuj_67.
?>
Javascript
输出:
The maximum average subarray of length 4 begins at index 1
上述解决方案的时间复杂度为 O(n),但需要 O(n) 辅助空间。
我们可以通过使用下面的Efficient Method来避免需要额外的空间。
1) 计算前“k”个元素的总和,即元素 arr[0..k-1]。让这个总和为“总和”。将“max_sum”初始化为“sum”
2) 对 i 从 'k' 到 'n-1' 变化的每个元素 arr[i] 执行以下操作
…….a) 从 sum 中去掉 arr[ik] 并加上 arr[i],即做 sum += arr[i] – arr[ik]
…….b) 如果到目前为止新的总和大于 max_sum,则更新 max_sum。
3)返回'max_sum'
C++
// C++ program to find maximum average subarray
// of given length.
#include
using namespace std;
// Returns beginning index of maximum average
// subarray of length 'k'
int findMaxAverage(int arr[], int n, int k)
{
// Check if 'k' is valid
if (k > n)
return -1;
// Compute sum of first 'k' elements
int sum = arr[0];
for (int i=1; i max_sum)
{
max_sum = sum;
max_end = i;
}
}
// Return starting index
return max_end - k + 1;
}
// Driver program
int main()
{
int arr[] = {1, 12, -5, -6, 50, 3};
int k = 4;
int n = sizeof(arr)/sizeof(arr[0]);
cout << "The maximum average subarray of "
"length "<< k << " begins at index "
<< findMaxAverage(arr, n, k);
return 0;
}
Java
// Java program to find maximum average subarray
// of given length.
import java.io.*;
class GFG {
// Returns beginning index of maximum average
// subarray of length 'k'
static int findMaxAverage(int arr[], int n, int k)
{
// Check if 'k' is valid
if (k > n)
return -1;
// Compute sum of first 'k' elements
int sum = arr[0];
for (int i = 1; i < k; i++)
sum += arr[i];
int max_sum = sum, max_end = k-1;
// Compute sum of remaining subarrays
for (int i = k; i < n; i++)
{
sum = sum + arr[i] - arr[i-k];
if (sum > max_sum)
{
max_sum = sum;
max_end = i;
}
}
// Return starting index
return max_end - k + 1;
}
// Driver program
public static void main (String[] args)
{
int arr[] = {1, 12, -5, -6, 50, 3};
int k = 4;
int n = arr.length;
System.out.println( "The maximum average"
+ " subarray of length " + k
+ " begins at index "
+ findMaxAverage(arr, n, k));
}
}
// This code is contributed by anuj_67.
Python3
# Python 3 program to find maximum
# average subarray of given length.
# Returns beginning index of maximum
# average subarray of length 'k'
def findMaxAverage(arr, n, k):
# Check if 'k' is valid
if (k > n):
return -1
# Compute sum of first 'k' elements
sum = arr[0]
for i in range(1, k):
sum += arr[i]
max_sum = sum
max_end = k - 1
# Compute sum of remaining subarrays
for i in range(k, n):
sum = sum + arr[i] - arr[i - k]
if (sum > max_sum):
max_sum = sum
max_end = i
# Return starting index
return max_end - k + 1
# Driver program
arr = [1, 12, -5, -6, 50, 3]
k = 4
n = len(arr)
print("The maximum average subarray of length", k,
"begins at index",
findMaxAverage(arr, n, k))
# This code is contributed by
# Smitha Dinesh Semwal
C#
// C# program to find maximum average
// subarray of given length.
using System;
class GFG {
// Returns beginning index of
// maximum average subarray of
// length 'k'
static int findMaxAverage(int []arr,
int n, int k)
{
// Check if 'k' is valid
if (k > n)
return -1;
// Compute sum of first 'k'
// elements
int sum = arr[0];
for (int i = 1; i < k; i++)
sum += arr[i];
int max_sum = sum;
int max_end = k-1;
// Compute sum of remaining
// subarrays
for (int i = k; i < n; i++)
{
sum = sum + arr[i] - arr[i-k];
if (sum > max_sum)
{
max_sum = sum;
max_end = i;
}
}
// Return starting index
return max_end - k + 1;
}
// Driver program
public static void Main ()
{
int []arr = {1, 12, -5, -6, 50, 3};
int k = 4;
int n = arr.Length;
Console.WriteLine( "The maximum "
+ "average subarray of length "
+ k + " begins at index "
+ findMaxAverage(arr, n, k));
}
}
// This code is contributed by anuj_67.
PHP
$n)
return -1;
// Compute sum of first
// 'k' elements
$sum = $arr[0];
for($i = 1; $i < $k; $i++)
$sum += $arr[$i];
$max_sum = $sum;
$max_end = $k-1;
// Compute sum of
// remaining subarrays
for($i = $k; $i < $n; $i++)
{
$sum = $sum + $arr[$i] -
$arr[$i - $k];
if ($sum > $max_sum)
{
$max_sum = $sum;
$max_end = $i;
}
}
// Return starting index
return $max_end - $k + 1;
}
// Driver Code
$arr = array(1, 12, -5, -6, 50, 3);
$k = 4;
$n = count($arr);
echo "The maximum average subarray of ",
"length ", $k , " begins at index "
, findMaxAverage($arr, $n, $k);
// This code is contributed by anuj_67.
?>
Javascript
输出:
The maximum average subarray of length 4 begins at index 1