Count maximum nonoverlapping subarrays with given sum (original) (raw)
Count maximum non-overlapping subarrays with given sum
Last Updated : 24 May, 2021
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 = 6
Output: 3
Explanation:
Subarrays {-1, 4, 3}, {6} and {5, 1} have sum equal to target(= 6).Input: arr[] = {2, 2, 2, 2, 2}, target = 4
Output: 2
Approach: To obtain the smallest non-overlapping subarrays with the sum target, the target is to use the Prefix Sum technique. Follow the steps below to solve the problem:
- Store all the sums calculated so far in a Map mp with key as the sum of the prefix till that index and value as the ending index of the subarray with that sum.
- If the prefix-sum till index i, say sum, is equal to target, check if sum - target exists in the Map or not.
- If sum - target exists in Map and mp[sum - target] = idx, it means that the subarray from [idx + 1, i] has sum equal to target.
- Now for non-overlapping subarrays, maintain an additional variable availIdx(initially set to -1), and take the subarray from [idx + 1, i] only when mp[sum - target] ? availIdx.
- Whenever such a subarray is found, increment the answer and change the value of availIdx to the current index.
- Also, for non-overlapping subarrays, it is always beneficial to greedily take subarrays as small as possible. So, for every prefix-sum found, update its index in the Map, even if it already exists.
- Print the value of count after completing the above steps.
Below is the implementation of the above approach:
C++ `
// C++ program for the above approach
#include <bits/stdc++.h> using namespace std;
// Function to count maximum number // of non-overlapping subarrays with // sum equals to the target int maximumSubarrays(int arr[], int N, int target) { // Stores the final count int ans = 0;
// Next subarray should start
// from index >= availIdx
int availIdx = -1;
// Tracks the prefix sum
int cur_sum = 0;
// Map to store the prefix sum
// for respective indices
unordered_map<int, int> mp;
mp[0] = -1;
for (int i = 0; i < N; i++) {
cur_sum += arr[i];
// Check if cur_sum - target is
// present in the array or not
if (mp.find(cur_sum - target)
!= mp.end()
&& mp[cur_sum - target]
>= availIdx) {
ans++;
availIdx = i;
}
// Update the index of
// current prefix sum
mp[cur_sum] = i;
}
// Return the count of subarrays
return ans;
}
// Driver Code int main() { // Given array arr[] int arr[] = { 2, -1, 4, 3, 6, 4, 5, 1 };
int N = sizeof(arr) / sizeof(arr[0]);
// Given sum target
int target = 6;
// Function Call
cout << maximumSubarrays(arr, N,
target);
return 0;
}
Java
// Java program for the above approach import java.util.*;
class GFG{
// Function to count maximum number // of non-overlapping subarrays with // sum equals to the target static int maximumSubarrays(int arr[], int N, int target) {
// Stores the final count
int ans = 0;
// Next subarray should start
// from index >= availIdx
int availIdx = -1;
// Tracks the prefix sum
int cur_sum = 0;
// Map to store the prefix sum
// for respective indices
HashMap<Integer,
Integer> mp = new HashMap<Integer,
Integer>();
mp.put(0, 1);
for(int i = 0; i < N; i++)
{
cur_sum += arr[i];
// Check if cur_sum - target is
// present in the array or not
if (mp.containsKey(cur_sum - target) &&
mp.get(cur_sum - target) >= availIdx)
{
ans++;
availIdx = i;
}
// Update the index of
// current prefix sum
mp.put(cur_sum, i);
}
// Return the count of subarrays
return ans;
}
// Driver Code public static void main(String[] args) {
// Given array arr[]
int arr[] = { 2, -1, 4, 3,
6, 4, 5, 1 };
int N = arr.length;
// Given sum target
int target = 6;
// Function call
System.out.print(maximumSubarrays(arr, N,
target));
} }
// This code is contributed by Amit Katiyar
Python3
Python3 program for the above approach
Function to count maximum number
of non-overlapping subarrays with
sum equals to the target
def maximumSubarrays(arr, N, target):
# Stores the final count
ans = 0
# Next subarray should start
# from index >= availIdx
availIdx = -1
# Tracks the prefix sum
cur_sum = 0
# Map to store the prefix sum
# for respective indices
mp = {}
mp[0] = -1
for i in range(N):
cur_sum += arr[i]
# Check if cur_sum - target is
# present in the array or not
if ((cur_sum - target) in mp and
mp[cur_sum - target] >= availIdx):
ans += 1
availIdx = i
# Update the index of
# current prefix sum
mp[cur_sum] = i
# Return the count of subarrays
return ans
Driver Code
if name == 'main':
# Given array arr[]
arr = [ 2, -1, 4, 3,
6, 4, 5, 1 ]
N = len(arr)
# Given sum target
target = 6
# Function call
print(maximumSubarrays(arr, N, target))
This code is contributed by mohit kumar 29
C#
// C# program for the above approach using System; using System.Collections.Generic; class GFG{
// Function to count maximum number // of non-overlapping subarrays with // sum equals to the target static int maximumSubarrays(int []arr, int N, int target) { // Stores the readonly count int ans = 0;
// Next subarray should start // from index >= availIdx int availIdx = -1;
// Tracks the prefix sum int cur_sum = 0;
// Map to store the prefix sum // for respective indices Dictionary<int, int> mp = new Dictionary<int, int>(); mp.Add(0, 1);
for(int i = 0; i < N; i++) { cur_sum += arr[i];
// Check if cur_sum - target is
// present in the array or not
if (mp.ContainsKey(cur_sum - target) &&
mp[cur_sum - target] >= availIdx)
{
ans++;
availIdx = i;
}
// Update the index of
// current prefix sum
if(mp.ContainsKey(cur_sum))
mp[cur_sum] = i;
else
mp.Add(cur_sum, i);
}
// Return the count of subarrays return ans; }
// Driver Code
public static void Main(String[] args)
{
// Given array []arr
int []arr = {2, -1, 4, 3,
6, 4, 5, 1};
int N = arr.Length;
// Given sum target int target = 6;
// Function call Console.Write(maximumSubarrays(arr, N, target)); } }
// This code is contributed by Princi Singh
JavaScript
`
Time Complexity: O(N)
Auxiliary Space: O(N)
Similar Reads
- Maximize count of non-overlapping subarrays with sum K 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 = 10Output: 3Explanation: All possible non-overlapping subarrays with sum K(= 10) are {-2, 6, 6}, {5, 4, 1}, {2, 6 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 count of distinct sized subarrays with given sum Given a binary array arr[] of N integers, the task is to find the maximum count of distinct sized subarrays such that the sum of each subarray is K. Example: Input: arr[] = {0, 1, 1 , 0}, K = 2Output: 3Explanation: The subset {{0, 1, 1, 0}, {0, 1, 1}, {1, 1}} is the subset of 3 subarrays such that t 7 min read
- Count of subarrays with maximum value as K Given an array arr[] of N integers and an integer K. The task is to find the number of subarrays with a maximum value is equal to K. Examples: Input: arr[ ] = {2, 1, 3, 4}, K = 3Output: 3Explanation: Sub-arrays with maximum value is equals K are { 2, 1, 3 }, { 1, 3 }, { 3 }, hence the answer is 3. I 8 min read
- Print all subarrays with sum in a given range Given an array arr[] of positive integers and two integers L and R defining the range [L, R]. The task is to print the subarrays having sum in the range L to R. Examples: Input: arr[] = {1, 4, 6}, L = 3, R = 8Output: {1, 4}, {4}, {6}.Explanation: All the possible subarrays are the following{1] with 5 min read
- Max sum of M non-overlapping subarrays of size K Given an array and two numbers M and K. We need to find the max sum of sums of M subarrays of size K (non-overlapping) in the array. (Order of array remains unchanged). K is the size of subarrays and M is the count of subarray. It may be assumed that size of array is more than m*k. If total array si 15+ min read
- Count subarrays with non-zero sum in the given Array Given an array arr[] of size N, the task is to count the total number of subarrays for the given array arr[] which have a non-zero-sum.Examples: Input: arr[] = {-2, 2, -3} Output: 4 Explanation: The subarrays with non zero sum are: [-2], [2], [2, -3], [-3]. All possible subarray of the given input a 7 min read
- Find all subarrays with sum in the given range Given an unsorted array of size, N. Find subarrays that add to a sum in the given range L-R. Examples: Input: arr[] = {2, 3, 5, 8}, L = 4, R = 13Output: The indexes of subarrays are {0, 1}, {0, 2}, {1, 2}, {2, 2}, {2, 3}, {3, 3} Input: arr[] = {1, 4, 6}, L = 3, R = 8Output: The indexes of subarrays 4 min read
- K maximum sums of non-overlapping contiguous sub-arrays Given an Array of Integers and an Integer value k, find out k non-overlapping sub-arrays which have k maximum sums. Examples: Input : arr1[] = {4, 1, 1, -1, -3, -5, 6, 2, -6, -2}, k = 3. Output : {4,1},{1} and {6,2} can be taken, thus the output should be 14. Input : arr2 = {5, 1, 2, -6, 2, -1, 3, 1 10 min read
- Count non-overlapping Subarrays of size K with equal alternate elements Given an array arr[] of length N, the task is to find the count of non-overlapping subarrays of size K such that the alternate elements are equal. Examples: Input: arr[] = {2, 4, 2, 7}, K = 3Output: 1Explanation: Given subarray {2, 4, 2} is a valid array because the elements in even position(index n 7 min read