Given an array, find the subarray (containing at least k numbers) which has the largest sum.
Examples:
Input : arr[] = {-4, -2, 1, -3}
k = 2
Output : -1
The sub array is {-2, 1}
Input : arr[] = {1, 1, 1, 1, 1, 1}
k = 2
Output : 6
The sub array is {1, 1, 1, 1, 1, 1}
Asked in : Facebook
This problem is an extension of Largest Sum Subarray Problem.
- We first compute maximum sum till every index and store it in an array maxSum[].
- After filling the array, we use the sliding window concept of size k. Keep track of sum of current k elements. To compute sum of current window, remove first element of previous window and add current element. After getting the sum of current window, we add the maxSum of the previous window, if it is greater than current max, then update it else not.
Below is the implementation of above approach:
C
#include <stdio.h>
int findMaxSum( int arr[], int N)
{
int dp[N][2];
if (N == 1) {
return arr[0];
}
dp[0][0] = 0;
dp[0][1] = arr[0];
for ( int i = 1; i < N; i++) {
dp[i][1] = dp[i - 1][0] + arr[i];
dp[i][0] = (dp[i - 1][1] > dp[i - 1][0])
? dp[i - 1][1]
: dp[i - 1][0];
}
return (dp[N - 1][0] > dp[N - 1][1]) ? dp[N - 1][0]
: dp[N - 1][1];
}
int main()
{
int arr[] = { 5, 5, 10, 100, 10, 5 };
int N = sizeof (arr) / sizeof (arr[0]);
printf ( "%d\n" , findMaxSum(arr, N));
return 0;
}
|
C++
#include<bits/stdc++.h>
using namespace std;
int maxSumWithK( int a[], int n, int k)
{
int maxSum[n];
maxSum[0] = a[0];
int curr_max = a[0];
for ( int i = 1; i < n; i++)
{
curr_max = max(a[i], curr_max+a[i]);
maxSum[i] = curr_max;
}
int sum = 0;
for ( int i = 0; i < k; i++)
sum += a[i];
int result = sum;
for ( int i = k; i < n; i++)
{
sum = sum + a[i] - a[i-k];
result = max(result, sum);
result = max(result, sum + maxSum[i-k]);
}
return result;
}
int main()
{
int a[] = {1, 2, 3, -10, -3};
int k = 4;
int n = sizeof (a)/ sizeof (a[0]);
cout << maxSumWithK(a, n, k);
return 0;
}
|
Java
class Test
{
static int maxSumWithK( int a[], int n, int k)
{
int maxSum[] = new int [n];
maxSum[ 0 ] = a[ 0 ];
int curr_max = a[ 0 ];
for ( int i = 1 ; i < n; i++)
{
curr_max = Math.max(a[i], curr_max+a[i]);
maxSum[i] = curr_max;
}
int sum = 0 ;
for ( int i = 0 ; i < k; i++)
sum += a[i];
int result = sum;
for ( int i = k; i < n; i++)
{
sum = sum + a[i] - a[i-k];
result = Math.max(result, sum);
result = Math.max(result, sum + maxSum[i-k]);
}
return result;
}
public static void main(String[] args)
{
int arr[] = { 1 , 2 , 3 , - 10 , - 3 };
int k = 4 ;
System.out.println(maxSumWithK(arr, arr.length, k));;
}
}
|
Python3
def maxSumWithK(a, n, k):
maxSum = [ 0 for i in range (n)]
maxSum[ 0 ] = a[ 0 ]
curr_max = a[ 0 ]
for i in range ( 1 , n):
curr_max = max (a[i], curr_max + a[i])
maxSum[i] = curr_max
sum = 0
for i in range (k):
sum + = a[i]
result = sum
for i in range (k, n):
sum = sum + a[i] - a[i - k]
result = max (result, sum )
result = max (result, sum + maxSum[i - k])
return result
a = [ 1 , 2 , 3 , - 10 , - 3 ]
k = 4
n = len (a)
print (maxSumWithK(a, n, k))
|
C#
using System;
class Test
{
static int maxSumWithK( int [] a, int n, int k)
{
int [] maxSum = new int [n];
maxSum[0] = a[0];
int curr_max = a[0];
for ( int i = 1; i < n; i++)
{
curr_max = Math.Max(a[i], curr_max+a[i]);
maxSum[i] = curr_max;
}
int sum = 0;
for ( int i = 0; i < k; i++)
sum += a[i];
int result = sum;
for ( int i = k; i < n; i++)
{
sum = sum + a[i] - a[i-k];
result = Math.Max(result, sum);
result = Math.Max(result, sum + maxSum[i-k]);
}
return result;
}
public static void Main()
{
int [] arr = {1, 2, 3, -10, -3};
int k = 4;
Console.Write(maxSumWithK(arr, arr.Length, k));;
}
}
|
PHP
<?php
function maxSumWithK( $a , $n , $k )
{
$maxSum [0] = $a [0];
$curr_max = $a [0];
for ( $i = 1; $i < $n ; $i ++)
{
$curr_max = max( $a [ $i ], $curr_max + $a [ $i ]);
$maxSum [ $i ] = $curr_max ;
}
$sum = 0;
for ( $i = 0; $i < $k ; $i ++)
$sum += $a [ $i ];
$result = $sum ;
for ( $i = $k ; $i < $n ; $i ++)
{
$sum = $sum + $a [ $i ] - $a [ $i - $k ];
$result = max( $result , $sum );
$result = max( $result , $sum +
$maxSum [ $i - $k ]);
}
return $result ;
}
$a = array (1, 2, 3, -10, -3);
$k = 4;
$n = sizeof( $a );
echo maxSumWithK( $a , $n , $k );
?>
|
Javascript
<script>
function maxSumWithK(a, n, k)
{
let maxSum = new Array(n);
maxSum[0] = a[0];
let curr_max = a[0];
for (let i = 1; i < n; i++)
{
curr_max = Math.max(a[i], curr_max+a[i]);
maxSum[i] = curr_max;
}
let sum = 0;
for (let i = 0; i < k; i++)
sum += a[i];
let result = sum;
for (let i = k; i < n; i++)
{
sum = sum + a[i] - a[i-k];
result = Math.max(result, sum);
result = Math.max(result, sum + maxSum[i-k]);
}
return result;
}
let arr = [1, 2, 3, -10, -3];
let k = 4;
document.write(maxSumWithK(arr, arr.length, k));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(n)
Here’s another approach:
- We will first compute the sum up to k numbers and store it in the sum.
- Then we will take another variable “last” and initialize with zero. This “last” variable will store sum of previous numbers.
- Now loop for i = k to i<n and store the sum in “sum” variable and take j=0 and do last += arr[j] if last becomes less than zero as in Kadane’s algorithm we subtract last from sum and set last = 0 and repeats this until we reach end.
C
#include <limits.h>
#include <stdio.h>
long long int maxSumWithK( long long int a[],
long long int n, long long int k)
{
long long int sum = 0;
for ( long long int i = 0; i < k; i++) {
sum += a[i];
}
long long int last = 0;
long long int j = 0;
long long int ans = LLONG_MIN;
ans = (ans > sum) ? ans : sum;
for ( long long int i = k; i < n; i++) {
sum = sum + a[i];
last = last + a[j++];
ans = (ans > sum) ? ans : sum;
if (last < 0) {
sum = sum - last;
ans = (ans > sum) ? ans : sum;
last = 0;
}
}
return ans;
}
int main()
{
long long int a[] = { 1, 2, 3, -10, -3 };
long long int k = 4;
long long int n = sizeof (a) / sizeof (a[0]);
printf ( "%lld" , maxSumWithK(a, n, k));
return 0;
}
|
C++
#include <bits/stdc++.h>
using namespace std;
long long int maxSumWithK( long long int a[],
long long int n, long long int k)
{
long long int sum = 0;
for ( long long int i = 0; i < k; i++) {
sum += a[i];
}
long long int last = 0;
long long int j = 0;
long long int ans = LLONG_MIN;
ans = max(ans, sum);
for ( long long int i = k; i < n; i++) {
sum = sum + a[i];
last = last + a[j++];
ans = max(ans, sum);
if (last < 0) {
sum = sum - last;
ans = max(ans, sum);
last = 0;
}
}
return ans;
}
int main()
{
long long int a[] = { 1, 2, 3, -10, -3 };
long long int k = 4;
long long int n = sizeof (a) / sizeof (a[0]);
cout << maxSumWithK(a, n, k);
return 0;
}
|
Java
class GFG {
static long maxSumWithK( long [] a, long n, int k)
{
long sum = 0 ;
for ( int i = 0 ; i < k; i++) {
sum += a[i];
}
long last = 0 ;
int j = 0 ;
long ans = Long.MIN_VALUE;
ans = Math.max(ans, sum);
for ( int i = k; i < n; i += 1 ) {
sum = sum + a[i];
last = last + a[j++];
ans = Math.max(ans, sum);
if (last < 0 ) {
sum = sum - last;
ans = Math.max(ans, sum);
last = 0 ;
}
}
return ans;
}
public static void main(String[] args) {
long [] arr = { 1 , 2 , 3 , - 10 , - 3 };
int k = 4 ;
long n = arr.length;
System.out.println(maxSumWithK(arr, n, k));
}
}
|
Python3
import sys
def maxSumWithK(a, n, k):
sum = 0
for i in range (k):
sum + = a[i]
last = 0
j = 0
ans = - sys.maxsize - 1
ans = max (ans, sum )
for i in range (k, n):
sum = sum + a[i]
last = last + a[j]
j + = 1
ans = max (ans, sum )
if (last < 0 ):
sum = sum - last
ans = max (ans, sum )
last = 0
return ans
a = [ 1 , 2 , 3 , - 10 , - 3 ]
k = 4
n = len (a)
print (maxSumWithK(a, n, k))
|
C#
using System;
public class GFG {
static long maxSumWithK( long [] a, long n, long k)
{
long sum = 0;
for ( long i = 0; i < k; i++) {
sum += a[i];
}
long last = 0;
long j = 0;
long ans = Int64.MinValue;
ans = Math.Max(ans, sum);
for ( long i = k; i < n; i++) {
sum = sum + a[i];
last = last + a[j++];
ans = Math.Max(ans, sum);
if (last < 0) {
sum = sum - last;
ans = Math.Max(ans, sum);
last = 0;
}
}
return ans;
}
public static void Main( string [] args)
{
long [] arr = { 1, 2, 3, -10, -3 };
long k = 4;
long n = arr.Length;
Console.WriteLine(maxSumWithK(arr, n, k));
}
}
|
Javascript
<script>
function maxSumWithK(a, n, k){
let sum = 0
for (let i = 0; i < k; i++)
sum += a[i]
let last = 0
let j = 0
let ans = Number.MIN_VALUE
ans = Math.max(ans,sum)
for (let i = k; i < n; i++)
{
sum = sum + a[i]
last = last + a[j]
j += 1
ans = Math.max(ans,sum)
if (last < 0)
{
sum = sum-last
ans = Math.max(ans,sum)
last = 0
}
}
return ans
}
let arr = [1, 2, 3, -10, -3];
let k = 4;
document.write(maxSumWithK(arr, arr.length, k));
</script>
|
Time Complexity: O(n)
Auxiliary Space: O(1)
This article is contributed by Rakesh Kumar. If you like neveropen and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the neveropen main page and help other Geeks.
Feeling lost in the world of random DSA topics, wasting time without progress? It’s time for a change! Join our DSA course, where we’ll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!