Encuentre la suma máxima (o mínima) de un subarreglo de tamaño k

Dado un arreglo de enteros y un número k, encuentre la suma máxima de un subarreglo de tamaño k. 

Ejemplos: 

Input  : arr[] = {100, 200, 300, 400}
         k = 2
Output : 700

Input  : arr[] = {1, 4, 2, 10, 23, 3, 1, 0, 20}
         k = 4 
Output : 39
We get maximum sum by adding subarray {4, 2, 10, 23}
of size 4.

Input  : arr[] = {2, 3}
         k = 3
Output : Invalid
There is no subarray of size 3 as size of whole
array is 2. 

Una solución simple es generar todos los subarreglos de tamaño k, calcular sus sumas y finalmente devolver el máximo de todas las sumas. La complejidad temporal de esta solución es O(n*k).

Una solución eficiente se basa en el hecho de que la suma de un subarreglo (o ventana) de tamaño k se puede obtener en un tiempo O(1) utilizando la suma del subarreglo (o ventana) anterior de tamaño k. Excepto por el primer subarreglo de tamaño k, para otros subarreglos, calculamos la suma eliminando el primer elemento de la última ventana y agregando el último elemento de la ventana actual.

A continuación se muestra la implementación de la idea anterior. 

C++

// O(n) solution for finding maximum sum of
// a subarray of size k
#include <iostream>
using namespace std;
 
// Returns maximum sum in a subarray of size k.
int maxSum(int arr[], int n, int k)
{
    // k must be smaller than n
    if (n < k)
    {
       cout << "Invalid";
       return -1;
    }
 
    // Compute sum of first window of size k
    int res = 0;
    for (int i=0; i<k; i++)
       res += arr[i];
 
    // Compute sums of remaining windows by
    // removing first element of previous
    // window and adding last element of
    // current window.
    int curr_sum = res;
    for (int i=k; i<n; i++)
    {
       curr_sum += arr[i] - arr[i-k];
       res = max(res, curr_sum);
    }
 
    return res;
}
  
// Driver code
int main()
{
    int arr[] = {1, 4, 2, 10, 2, 3, 1, 0, 20};
    int k = 4;
    int n = sizeof(arr)/sizeof(arr[0]);
    cout << maxSum(arr, n, k);
    return 0;
}

Java

// JAVA Code for Find maximum (or minimum)
// sum of a subarray of size k
import java.util.*;
 
class GFG {
     
    // Returns maximum sum in a subarray of size k.
    public static int maxSum(int arr[], int n, int k)
    {
        // k must be smaller than n
        if (n < k)
        {
           System.out.println("Invalid");
           return -1;
        }
      
        // Compute sum of first window of size k
        int res = 0;
        for (int i=0; i<k; i++)
           res += arr[i];
      
        // Compute sums of remaining windows by
        // removing first element of previous
        // window and adding last element of
        // current window.
        int curr_sum = res;
        for (int i=k; i<n; i++)
        {
           curr_sum += arr[i] - arr[i-k];
           res = Math.max(res, curr_sum);
        }
      
        return res;
    }
     
    /* Driver program to test above function */
    public static void main(String[] args)
    {
        int arr[] = {1, 4, 2, 10, 2, 3, 1, 0, 20};
        int k = 4;
        int n = arr.length;
        System.out.println(maxSum(arr, n, k));
    }
}
// This code is contributed by Arnav Kr. Mandal.

Python3

# O(n) solution in Python3 for finding
# maximum sum of a subarray of size k
 
# Returns maximum sum in
# a subarray of size k.
def maxSum(arr, n, k):
 
    # k must be smaller than n
    if (n < k):
     
        print("Invalid")
        return -1
     
    # Compute sum of first
    # window of size k
    res = 0
    for i in range(k):
        res += arr[i]
 
    # Compute sums of remaining windows by
    # removing first element of previous
    # window and adding last element of
    # current window.
    curr_sum = res
    for i in range(k, n):
     
        curr_sum += arr[i] - arr[i-k]
        res = max(res, curr_sum)
 
    return res
 
# Driver code
arr = [1, 4, 2, 10, 2, 3, 1, 0, 20]
k = 4
n = len(arr)
print(maxSum(arr, n, k))
 
# This code is contributed by Anant Agarwal.

C#

// C# Code for Find maximum (or minimum)
// sum of a subarray of size k
using System;
 
class GFG {
     
    // Returns maximum sum in
    // a subarray of size k.
    public static int maxSum(int []arr,
                             int n,
                             int k)
    {
         
        // k must be smaller than n
        if (n < k)
        {
            Console.Write("Invalid");
            return -1;
        }
     
        // Compute sum of first window of size k
        int res = 0;
        for (int i = 0; i < k; i++)
        res += arr[i];
     
        // Compute sums of remaining windows by
        // removing first element of previous
        // window and adding last element of
        // current window.
        int curr_sum = res;
        for (int i = k; i < n; i++)
        {
            curr_sum += arr[i] - arr[i - k];
            res = Math.Max(res, curr_sum);
        }
     
        return res;
    }
     
    // Driver Code
    public static void Main()
    {
        int []arr = {1, 4, 2, 10, 2, 3, 1, 0, 20};
        int k = 4;
        int n = arr.Length;
        Console.Write(maxSum(arr, n, k));
    }
}
 
// This code is contributed by nitin mittal.

PHP

<?php
// O(n) solution for finding maximum
// sum of a subarray of size k
 
// Returns maximum sum in a
// subarray of size k.
function maxSum($arr, $n, $k)
{
     
    // k must be smaller than n
    if ($n < $k)
    {
        echo "Invalid";
        return -1;
    }
 
    // Compute sum of first
    // window of size k
    $res = 0;
    for($i = 0; $i < $k; $i++)
    $res += $arr[$i];
 
    // Compute sums of remaining windows by
    // removing first element of previous
    // window and adding last element of
    // current window.
    $curr_sum = $res;
    for($i = $k; $i < $n; $i++)
    {
        $curr_sum += $arr[$i] -
                     $arr[$i - $k];
        $res = max($res, $curr_sum);
    }
 
    return $res;
}
 
    // Driver Code
    $arr = array(1, 4, 2, 10, 2, 3, 1, 0, 20);
    $k = 4;
    $n = sizeof($arr);
    echo maxSum($arr, $n, $k);
 
// This code is contributed by nitin mittal.
?>

Javascript

<script>
    // JAVA SCRIPT Code for Find maximum (or minimum)
    // sum of a subarray of size k
 
     
    // Returns maximum sum in a subarray of size k.
    function maxSum(arr,n,k)
    {
        // k must be smaller than n
        if (n < k)
        {
            document.write("Invalid");
            return -1;
        }
     
        // Compute sum of first window of size k
        let res = 0;
        for (let i=0; i<k; i++)
        res += arr[i];
     
        // Compute sums of remaining windows by
        // removing first element of previous
        // window and adding last element of
        // current window.
        let curr_sum = res;
        for (let i=k; i<n; i++)
        {
            curr_sum += arr[i] - arr[i-k];
            res = Math.max(res, curr_sum);
        }
     
        return res;
    }
     
    /* Driver program to test above function */
     
        let arr = [1, 4, 2, 10, 2, 3, 1, 0, 20];
        let k = 4;
        let n = arr.length;
        document.write(maxSum(arr, n, k));
     
// This code is contributed by sravan kumar Gottumukkala
</script>
Producción

24

Complejidad temporal: O(n)
Espacio auxiliar: O(1) 

Este artículo es una contribución de Abhishek Gupta . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo y enviarlo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *