📜  找到 k 长度的最大平均子数组

📅  最后修改于: 2022-05-13 01:57:52.009000             🧑  作者: Mango

找到 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