Maximize count of nonoverlapping subarrays with sum K (original) (raw)
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 st = new HashSet();
// 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
`
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
- 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
- Maximum sum of lengths of non-overlapping subarrays with k as the max element. Find the maximum sum of lengths of non-overlapping subarrays (contiguous elements) with k as the maximum element. Examples: Input : arr[] = {2, 1, 4, 9, 2, 3, 8, 3, 4} k = 4 Output : 5 {2, 1, 4} => Length = 3 {3, 4} => Length = 2 So, 3 + 2 = 5 is the answer Input : arr[] = {1, 2, 3, 2, 3, 4, 1 15+ 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
- Maximum non overlapping Subset with sum greater than K Given an array, arr[] and integer K, the task is to find the maximum number of non-overlapping subsets such that the sum of the subsets is strictly greater than K when you may also change the value of each element to the maximum value of the particular subset. Examples: Input: arr[]= {90, 80, 70, 60 5 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