Count of subarrays with unique sum with sum at most K

• Difficulty Level : Easy
• Last Updated : 29 Dec, 2022

Given an array arr[] of size N and an integer K., The task is to count the number of subarrays with unique sum with sum at most K.

Examples:

Input: N = 3, arr[] = {1, 0, 1}, K = 1
Output: 2
Explanation: All Subarrays are [1], [0], [1], [1, 0], [0, 1], [1, 0, 1] & The sum of these subarrays are {1, 0, 1, 1, 1, 2} respectively. There are only 2 distinct possible sums less than or equal to 1
Input: N = 1, arr[] = {1}, K = 0
Output: 0

Approach: The task can be solved by calculating sums of each subarray and storing them in a HashMap. Iterate over the HashMap, and increment the count, if the sum is at most K

Below is the implementation of the above approach

C++14

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Function to calculate the valid sums``void` `solve(``int` `arr[], ``int` `n, ``int` `k)``{` `    ``// Store the distinct subarray sums``    ``unordered_map<``int``, ``int``> occ;` `    ``int` `cur = 0;``    ``for` `(``int` `i = 0; i < n; i++) {``        ``cur = 0;``        ``for` `(``int` `j = i; j < n; j++) {``            ``cur += arr[j];``            ``occ[cur]++;``        ``}``    ``}` `    ``// Stores the answer``    ``int` `ans = 0;``    ``for` `(``auto` `x : occ) {``        ``if` `(x.first <= k)``            ``ans++;``    ``}` `    ``cout << ans << endl;``}` `// Driver Code``int` `main()``{``    ``int` `N = 3, K = 1;``    ``int` `arr[3] = { 1, 0, 1 };` `    ``solve(arr, N, K);``    ``return` `0;``}`

Java

 `// Java program for the above approach``import` `java.util.*;` `class` `GFG{` `// Function to calculate the valid sums``static` `void` `solve(``int` `arr[], ``int` `n, ``int` `k)``{` `    ``// Store the distinct subarray sums``    ``HashMap occ = ``new` `HashMap();` `    ``int` `cur = ``0``;``    ``for` `(``int` `i = ``0``; i < n; i++) {``        ``cur = ``0``;``        ``for` `(``int` `j = i; j < n; j++) {``            ``cur += arr[j];``            ``if``(occ.containsKey(cur)){``                ``occ.put(cur, occ.get(cur)+``1``);``            ``}``            ``else``{``                ``occ.put(cur, ``1``);``            ``}``        ``}``    ``}` `    ``// Stores the answer``    ``int` `ans = ``0``;``    ``for` `(Map.Entry x : occ.entrySet()) {``        ``if` `(x.getKey() <= k)``            ``ans++;``    ``}` `    ``System.out.print(ans +``"\n"``);``}` `// Driver Code``public` `static` `void` `main(String[] args)``{``    ``int` `N = ``3``, K = ``1``;``    ``int` `arr[] = { ``1``, ``0``, ``1` `};` `    ``solve(arr, N, K);``}``}` `// This code is contributed by 29AjayKumar`

Python3

 `# python program for the above approach` `# Function to calculate the valid sums``def` `solve(arr, n, k):` `    ``# Store the distinct subarray sums``    ``occ ``=` `{}` `    ``cur ``=` `0``    ``for` `i ``in` `range``(``0``, n):``        ``cur ``=` `0``        ``for` `j ``in` `range``(i, n):``            ``cur ``+``=` `arr[j]``            ``if` `cur ``in` `occ:``                ``occ[cur] ``+``=` `1``            ``else``:``                ``occ[cur] ``=` `1` `        ``# Stores the answer``    ``ans ``=` `0``    ``for` `x ``in` `occ:``        ``if` `(x <``=` `k):``            ``ans ``+``=` `1` `    ``print``(ans)` `# Driver Code``if` `__name__ ``=``=` `"__main__"``:``    ``N ``=` `3``    ``K ``=` `1` `    ``arr ``=` `[``1``, ``0``, ``1``]``    ``solve(arr, N, K)` `    ``# This code is contributed by rakeshsahni`

C#

 `// C# program for the above approach``using` `System;``using` `System.Collections.Generic;``class` `GFG``{``  ` `    ``// Function to calculate the valid sums``    ``static` `void` `solve(``int``[] arr, ``int` `n, ``int` `k)``    ``{` `        ``// Store the distinct subarray sums``        ``Dictionary<``int``, ``int``> occ``            ``= ``new` `Dictionary<``int``, ``int``>();` `        ``int` `cur = 0;``        ``for` `(``int` `i = 0; i < n; i++) {``            ``cur = 0;``            ``for` `(``int` `j = i; j < n; j++) {``                ``cur += arr[j];``                ``if` `(!occ.ContainsKey(cur))``                    ``occ[cur] = 0;``                ``else``                    ``occ[cur]++;``            ``}``        ``}` `        ``// Stores the answer``        ``int` `ans = 0;``        ``foreach``(KeyValuePair<``int``, ``int``> x ``in` `occ)``        ``{``            ``if` `(x.Key <= k)``                ``ans++;``        ``}` `        ``Console.WriteLine(ans);``    ``}` `    ``// Driver Code``    ``public` `static` `void` `Main()``    ``{``        ``int` `N = 3, K = 1;``        ``int``[] arr = { 1, 0, 1 };` `        ``solve(arr, N, K);``    ``}``}` `// This code is contributed by ukasp.`

Javascript

 ``

Output

`2`

Time Complexity: O(N2)
Auxiliary Space: O(N)

My Personal Notes arrow_drop_up