Maximize count of non-overlapping subarrays with sum K
Last Updated :
11 Jul, 2022
Given an array arr[] and an integer K, the task is to print the maximum number of non-overlapping subarrays with a sum equal to K.
Examples:
Input: arr[] = {-2, 6, 6, 3, 5, 4, 1, 2, 8}, K = 10
Output: 3
Explanation: All possible non-overlapping subarrays with sum K(= 10) are {-2, 6, 6}, {5, 4, 1}, {2, 8}. Therefore, the required count is 3.
Input: arr[] = {1, 1, 1}, K = 2
Output: 1
Approach: The problem can be solved using the concept of prefix sum. Follow the below steps to solve the problem:
- Initialize a set to store all the prefix sums obtained up to the current element.
- Initialize variables prefixSum and res, to store the prefix sum of the current subarray and the count of subarrays with a sum equal to K respectively.
- Iterate over the array and for each array element, update prefixSum by adding to it the current element. Now, check if the value prefixSum - K is already present in the set or not. If found to be true, increment res, clear the set, and reset the value of prefixSum.
- Repeat the above steps until the entire array is traversed. Finally, print the value of res.
C++14
// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to count the maximum
// number of subarrays with sum K
int CtSubarr(int arr[], int N, int K)
{
// Stores all the distinct
// prefixSums obtained
unordered_set<int> st;
// Stores the prefix sum
// of the current subarray
int prefixSum = 0;
st.insert(prefixSum);
// Stores the count of
// subarrays with sum K
int res = 0;
for (int i = 0; i < N; i++) {
prefixSum += arr[i];
// If a subarray with sum K
// is already found
if (st.count(prefixSum - K)) {
// Increase count
res += 1;
// Reset prefix sum
prefixSum = 0;
// Clear the set
st.clear();
st.insert(0);
}
// Insert the prefix sum
st.insert(prefixSum);
}
return res;
}
// Driver Code
int main()
{
int arr[] = { -2, 6, 6, 3, 5, 4, 1, 2, 8 };
int N = sizeof(arr) / sizeof(arr[0]);
int K = 10;
cout << CtSubarr(arr, N, K);
}
Java
// Java Program to implement
// the above approach
import java.util.*;
class GFG{
// Function to count the maximum
// number of subarrays with sum K
static int CtSubarr(int[] arr,
int N, int K)
{
// Stores all the distinct
// prefixSums obtained
Set<Integer> st = new HashSet<Integer>();
// Stores the prefix sum
// of the current subarray
int prefixSum = 0;
st.add(prefixSum);
// Stores the count of
// subarrays with sum K
int res = 0;
for (int i = 0; i < N; i++)
{
prefixSum += arr[i];
// If a subarray with sum K
// is already found
if (st.contains(prefixSum - K))
{
// Increase count
res += 1;
// Reset prefix sum
prefixSum = 0;
// Clear the set
st.clear();
st.add(0);
}
// Insert the prefix sum
st.add(prefixSum);
}
return res;
}
// Driver Code
public static void main(String[] args)
{
int arr[] = {-2, 6, 6, 3,
5, 4, 1, 2, 8};
int N = arr.length;
int K = 10;
System.out.println(CtSubarr(arr, N, K));
}
}
// This code is contributed by Chitranayal
Python3
# Python3 program to implement
# the above approach
# Function to count the maximum
# number of subarrays with sum K
def CtSubarr(arr, N, K):
# Stores all the distinct
# prefixSums obtained
st = set()
# Stores the prefix sum
# of the current subarray
prefixSum = 0
st.add(prefixSum)
# Stores the count of
# subarrays with sum K
res = 0
for i in range(N):
prefixSum += arr[i]
# If a subarray with sum K
# is already found
if((prefixSum - K) in st):
# Increase count
res += 1
# Reset prefix sum
prefixSum = 0
# Clear the set
st.clear()
st.add(0)
# Insert the prefix sum
st.add(prefixSum)
return res
# Driver Code
arr = [ -2, 6, 6, 3, 5, 4, 1, 2, 8 ]
N = len(arr)
K = 10
# Function call
print(CtSubarr(arr, N, K))
# This code is contributed by Shivam Singh
C#
// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
class GFG{
// Function to count the maximum
// number of subarrays with sum K
static int CtSubarr(int[] arr,
int N, int K)
{
// Stores all the distinct
// prefixSums obtained
HashSet<int> st = new HashSet<int>();
// Stores the prefix sum
// of the current subarray
int prefixSum = 0;
st.Add(prefixSum);
// Stores the count of
// subarrays with sum K
int res = 0;
for(int i = 0; i < N; i++)
{
prefixSum += arr[i];
// If a subarray with sum K
// is already found
if (st.Contains(prefixSum - K))
{
// Increase count
res += 1;
// Reset prefix sum
prefixSum = 0;
// Clear the set
st.Clear();
st.Add(0);
}
// Insert the prefix sum
st.Add(prefixSum);
}
return res;
}
// Driver Code
public static void Main(String[] args)
{
int []arr = { -2, 6, 6, 3,
5, 4, 1, 2, 8};
int N = arr.Length;
int K = 10;
Console.WriteLine(CtSubarr(arr, N, K));
}
}
// This code is contributed by 29AjayKumar
JavaScript
<script>
// Javascript Program to implement
// the above approach
// Function to count the maximum
// number of subarrays with sum K
function CtSubarr(arr, N, K)
{
// Stores all the distinct
// prefixSums obtained
var st = new Set();
// Stores the prefix sum
// of the current subarray
var prefixSum = 0;
st.add(prefixSum);
// Stores the count of
// subarrays with sum K
var res = 0;
for (var i = 0; i < N; i++) {
prefixSum += arr[i];
// If a subarray with sum K
// is already found
if (st.has(prefixSum - K)) {
// Increase count
res += 1;
// Reset prefix sum
prefixSum = 0;
// Clear the set
st = new Set();
st.add(0);
}
// Insert the prefix sum
st.add(prefixSum);
}
return res;
}
// Driver Code
var arr = [-2, 6, 6, 3, 5, 4, 1, 2, 8];
var N = arr.length;
var K = 10;
document.write( CtSubarr(arr, N, K));
// This code is contributed by importantly.
</script>
Time Complexity: O(N)
Auxiliary Space: O(N)
Related Topic: Subarrays, Subsequences, and Subsets in Array
Similar Reads
Count maximum non-overlapping subarrays with given sum Given an array arr[] consisting of N integers and an integer target, the task is to find the maximum number of non-empty non-overlapping subarrays such that the sum of array elements in each subarray is equal to the target. Examples: Input: arr[] = {2, -1, 4, 3, 6, 4, 5, 1}, target = 6Output: 3Expla
7 min read
Maximum sum of at most K non-overlapping Subarray Given an array, arr[] of size N, the task is to find the sum of the at most K non-overlapping contiguous subarray within an arr[] with the maximum sum. Examples: Input: arr[] = [4, 1, -3, 7, -5, 6, -2, 1], K = 3Output: 18Explanation: In the above input, the maximum k subarray sum is 18 and the subar
15 min read
Maximum sum two non-overlapping subarrays of given size Given an array, we need to find two subarrays with a specific length K such that sum of these subarrays is maximum among all possible choices of subarrays. Examples: Input : arr[] = [2, 5, 1, 2, 7, 3, 0] K = 2 Output : 2 5 7 3 We can choose two arrays of maximum sum as [2, 5] and [7, 3], the sum of
12 min read
Maximum Sum of two non-overlapping Subarrays of any length Given an array A consisting of N integers, the task is to find the maximum sum of two non-overlapping subarrays of any length of the array. Note: You can select empty subarrays also. Examples: Input: N = 3, A[] = {-4, -5, -2}Output: 0Explanation: Two empty subarrays are optimal with maximum sum = 0.
6 min read
Maximum sum of non-overlapping subarrays of length atmost K Given an integer array 'arr' of length N and an integer 'k', select some non-overlapping subarrays such that each sub-array if of length at most 'k', no two sub-arrays are adjacent and sum of all the elements of the selected sub-arrays are maximum.Examples: Input : arr[] = {-1, 2, -3, 4, 5}, k = 2 O
10 min read