Open In App

Number of subarrays having sum exactly equal to k

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Given an unsorted array of integers, find the number of subarrays having a sum exactly equal to a given number k.

Examples: 

Input : arr[] = {10, 2, -2, -20, 10}, k = -10
Output : 3
Explanation: Subarrays: arr[0…3], arr[1…4], arr[3..4] have a sum exactly equal to -10.

Input : arr[] = {9, 4, 20, 3, 10, 5}, k = 33
Output : 2
Explanation: Subarrays : arr[0…2], arr[2…4] have a sum exactly equal to 33.

Recommended Practice

Naive Solution: A simple solution is to traverse all the subarrays and calculate their sum. If the sum is equal to the required sum, then increment the count of subarrays. Print final count of subarray.
Below is the implementation of the above approach:

C++




// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
int main()
{
  int arr[] = {10, 2, -2, -20, 10};
  int k = -10;
  int n = sizeof(arr) / sizeof(arr[0]);
  int res = 0;
 
  // Calculate all subarrays
  for (int i = 0; i < n; i++)
  {
    int sum = 0;
    for (int j = i; j < n; j++)
    {
      // Calculate required sum
      sum += arr[j];
      // Check if sum is equal to required sum
      if (sum == k)
        res++;
    }
  }
  cout << (res) << endl;
}
 
// This code is contributed by Aditya Kumar (adityakumar129)


C




// C program for the above approach
#include <stdio.h>
int main()
{
    int arr[] = { 10, 2, -2, -20, 10 };
    int k = -10;
    int n = sizeof(arr) / sizeof(arr[0]);
    int res = 0;
 
    // Calculate all subarrays
    for (int i = 0; i < n; i++) {
        int sum = 0;
        for (int j = i; j < n; j++)
        {
           
            // Calculate required sum
            sum += arr[j];
           
            // Check if sum is equal to required sum
            if (sum == k)
                res++;
        }
    }
    printf("%d\n", res);
}
 
// This code is contributed by Aditya Kumar (adityakumar129)


Java




// Java program for the above approach
import java.util.*;
class Solution {
 
    public static void main(String[] args)
    {
        int arr[] = { 10, 2, -2, -20, 10 };
        int k = -10;
        int n = arr.length;
        int res = 0;
 
        // calculate all subarrays
        for (int i = 0; i < n; i++) {
            int sum = 0;
            for (int j = i; j < n; j++) {
                // calculate required sum
                sum += arr[j];
                // check if sum is equal to required sum
                if (sum == k)
                    res++;
            }
        }
        System.out.println(res);
    }
}
 
// This code is contributed by Aditya Kumar (adityakumar129)


Python3




# Python3 program for
# the above approach
# Calculate all subarrays
 
 
def count_all_subarrys(arr,  n):
    # count all subarrays
    res = 0
    for i in range(n):
        summ = 0
        for j in range(i, n):
 
            # Calculate required sum
            summ += arr[j]
 
            # Check if sum is equal to
            # required sum
            if summ == k:
                res += 1
    return res
 
 
# main function
if __name__ == "__main__":
    arr = [10, 2, -2, -20, 10]
    n = len(arr)
    k = -10
    print(count_all_subarrys(arr, n))
 
# This code is contributed by shushant kumar


C#




// C# program for
// the above approach
using System;
using System.Collections.Generic;
class GFG {
     
  static void Main() {
      int[] arr = {10, 2, -2, -20, 10};
      int k = -10;
      int n = arr.Length;
      int res = 0;
      
      // Calculate all subarrays
      for (int i = 0; i < n; i++)
      {
        int sum = 0;
        for (int j = i; j < n; j++)
        {
           
          // Calculate required sum
          sum += arr[j];
      
          // Check if sum is equal to
          // required sum
          if (sum == k)
            res++;
        }
      }
      Console.WriteLine(res);
  }
}
 
// This code is contributed by divyesh072019


Javascript




<script>
     
// Javascript program for
// the above approach
let arr = [ 10, 2, -2, -20, 10 ];
let k = -10;
let n = arr.length;
let res = 0;
 
// Calculate all subarrays
for(let i = 0; i < n; i++)
{
    let sum = 0;
    for(let j = i; j < n; j++)
    {
         
        // Calculate required sum
        sum += arr[j];
         
        // Check if sum is equal to
        // required sum
        if (sum == k)
            res++;
    }
}
document.write(res);
 
// This code is contributed by suresh07
   
</script>


Output

3

Time Complexity : O(n2)
Auxiliary Space: O(1)

Efficient Solution : 

An efficient solution is while traversing the array, storing sum so far in currsum. Also, maintain the count of different values of currsum in a map. If the value of currsum is equal to the desired sum at any instance increment count of subarrays by one. 

The value of currsum exceeds the desired sum by currsum – sum. If this value is removed from currsum then the desired sum can be obtained. From the map, find the number of subarrays previously found having sum equal to currsum-sum. Excluding all those subarrays from the current subarray, gives new subarrays having the desired sum. 

So increase count by the number of such subarrays. Note that when currsum is equal to the desired sum then also check the number of subarrays previously having a sum equal to 0. Excluding those subarrays from the current subarray gives new subarrays having the desired sum. Increase the count by the number of subarrays having sum 0 in that case.

Implementation:

C++




// C++ program to find number of subarrays with sum exactly
// equal to k.
#include <bits/stdc++.h>
using namespace std;
 
// Function to find number of subarrays with sum exactly
// equal to k.
int findSubarraySum(int arr[], int n, int sum)
{
    // STL map to store number of subarrays starting from
    // index zero having particular value of sum.
    unordered_map<int, int> prevSum;
 
    int res = 0;
 
    // Sum of elements so far.
    int currSum = 0;
 
    for (int i = 0; i < n; i++) {
 
        // Add current element to sum so far.
        currSum += arr[i];
 
        // If currsum is equal to desired sum, then a new
        // subarray is found. So increase count of
        // subarrays.
        if (currSum == sum)
            res++;
 
        // currsum exceeds given sum by currsum  - sum. Find
        // number of subarrays having this sum and exclude
        // those subarrays from currsum by increasing count
        // by same amount.
        if (prevSum.find(currSum - sum) != prevSum.end())
            res += (prevSum[currSum - sum]);
 
        // Add currsum value to count of different values of
        // sum.
        prevSum[currSum]++;
    }
 
    return res;
}
 
int main()
{
    int arr[] = { 10, 2, -2, -20, 10 };
    int sum = -10;
    int n = sizeof(arr) / sizeof(arr[0]);
    cout << findSubarraySum(arr, n, sum);
    return 0;
}
 
// This code is contributed by Aditya Kumar (adityakumar129)


Java




// Java program to find number of subarrays
// with sum exactly equal to k.
import java.util.HashMap;
import java.util.Map;
 
public class GfG {
 
    // Function to find number of subarrays
    // with sum exactly equal to k.
    static int findSubarraySum(int arr[], int n, int sum)
    {
        // HashMap to store number of subarrays
        // starting from index zero having
        // particular value of sum.
        HashMap<Integer, Integer> prevSum = new HashMap<>();
        prevSum.put(0,1);
        int res = 0;
 
        // Sum of elements so far.
        int currSum = 0;
 
        for (int i = 0; i < n; i++) {
 
            // Add current element to sum so far.
            currSum += arr[i];
            //calculate the sum that have to be removed
          //so that we can get the desired sum
            
            int removeSum=currSum-sum;
 
           //get count of occurrences of that sum that
          //have to removed and add it to res value
            if (prevSum.containsKey(removeSum))
                res += prevSum.get(removeSum);
 
            // Add currsum value to count of
            // different values of sum.
            prevSum.put(currSum,prevSum.getOrDefault(currSum,0)+1);
        }
 
        return res;
    }
 
    public static void main(String[] args)
    {
 
        int arr[] = { 10, 2, -2, -20, 10 };
        int sum = -10;
        int n = arr.length;
        System.out.println(findSubarraySum(arr, n, sum));
    }
}
 
// This code is contributed by Rituraj Jain


Python3




# Python3 program to find the number of
# subarrays with sum exactly equal to k.
from collections import defaultdict
 
# Function to find number of subarrays 
# with sum exactly equal to k.
def findSubarraySum(arr, n, Sum):
  
    # Dictionary to store number of subarrays
    # starting from index zero having 
    # particular value of sum.
    prevSum = defaultdict(lambda : 0)
   
    res = 0
   
    # Sum of elements so far.
    currsum = 0
   
    for i in range(0, n): 
   
        # Add current element to sum so far.
        currsum += arr[i]
   
        # If currsum is equal to desired sum,
        # then a new subarray is found. So
        # increase count of subarrays.
        if currsum == Sum
            res += 1        
   
        # currsum exceeds given sum by currsum  - sum.
        # Find number of subarrays having 
        # this sum and exclude those subarrays
        # from currsum by increasing count by 
        # same amount.
        if (currsum - Sum) in prevSum:
            res += prevSum[currsum - Sum]
           
   
        # Add currsum value to count of 
        # different values of sum.
        prevSum[currsum] += 1
      
    return res
  
if __name__ == "__main__":
 
    arr =  [10, 2, -2, -20, 10
    Sum = -10
    n = len(arr)
    print(findSubarraySum(arr, n, Sum))
     
# This code is contributed by Rituraj Jain


C#




// C# program to find number of subarrays
// with sum exactly equal to k.
using System;
using System.Collections.Generic;
 
class GFG {
    // Function to find number of subarrays
    // with sum exactly equal to k.
    public static int findSubarraySum(int[] arr,
                                      int n, int sum)
    {
 
        // HashMap to store number of subarrays
        // starting from index zero having
        // particular value of sum.
        Dictionary<int, int> prevSum = new Dictionary<int, int>();
 
        int res = 0;
 
        // Sum of elements so far
        int currsum = 0;
 
        for (int i = 0; i < n; i++) {
 
            // Add current element to sum so far.
            currsum += arr[i];
 
            // If currsum is equal to desired sum,
            // then a new subarray is found. So
            // increase count of subarrays.
            if (currsum == sum)
                res++;
 
            // currsum exceeds given sum by currsum
            // - sum. Find number of subarrays having
            // this sum and exclude those subarrays
            // from currsum by increasing count by
            // same amount.
            if (prevSum.ContainsKey(currsum - sum))
                res += prevSum[currsum - sum];
 
            // Add currsum value to count of
            // different values of sum.
            if (!prevSum.ContainsKey(currsum))
                prevSum.Add(currsum, 1);
            else {
                int count = prevSum[currsum];
                prevSum[currsum] = count + 1;
            }
        }
        return res;
    }
 
    // Driver Code
    public static void Main()
    {
        int[] arr = { 10, 2, -2, -20, 10 };
        int sum = -10;
        int n = arr.Length;
        Console.Write(findSubarraySum(arr, n, sum));
    }
}
 
// This code is contributed by
// sanjeev2552


Javascript




<div id="highlighter_354795" class="syntaxhighlighter nogutter  "><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="plain"><script></code></div><div class="line number2 index1 alt1"><code class="comments">// Javascript program to find number of subarrays</code></div><div class="line number3 index2 alt2"><code class="comments">// with sum exactly equal to k.</code></div><div class="line number4 index3 alt1"><code class="undefined spaces">    </code> </div><div class="line number5 index4 alt2"><code class="undefined spaces">    </code><code class="comments">// Function to find number of subarrays</code></div><div class="line number6 index5 alt1"><code class="undefined spaces">    </code><code class="comments">// with sum exactly equal to k.</code></div><div class="line number7 index6 alt2"><code class="undefined spaces">    </code><code class="keyword">function</code> <code class="plain">findSubarraySum(arr,n,sum)</code></div><div class="line number8 index7 alt1"><code class="undefined spaces">    </code><code class="plain">{</code></div><div class="line number9 index8 alt2"><code class="undefined spaces">    </code> </div><div class="line number10 index9 alt1"><code class="undefined spaces">        </code><code class="comments">// HashMap to store number of subarrays</code></div><div class="line number11 index10 alt2"><code class="undefined spaces">        </code><code class="comments">// starting from index zero having</code></div><div class="line number12 index11 alt1"><code class="undefined spaces">        </code><code class="comments">// particular value of sum.</code></div><div class="line number13 index12 alt2"><code class="undefined spaces">        </code><code class="plain">let prevSum = </code><code class="keyword">new</code> <code class="plain">Map();</code></div><div class="line number14 index13 alt1"><code class="undefined spaces">        </code><code class="plain">let res = 0;</code></div><div class="line number15 index14 alt2"><code class="undefined spaces"> </code> </div><div class="line number16 index15 alt1"><code class="undefined spaces">        </code><code class="comments">// Sum of elements so far.</code></div><div class="line number17 index16 alt2"><code class="undefined spaces">        </code><code class="plain">let currsum = 0;</code></div><div class="line number18 index17 alt1"><code class="undefined spaces">        </code><code class="keyword">for</code> <code class="plain">(let i = 0; i < n; i++)</code></div><div class="line number19 index18 alt2"><code class="undefined spaces">        </code><code class="plain">{</code></div><div class="line number20 index19 alt1"><code class="undefined spaces"> </code> </div><div class="line number21 index20 alt2"><code class="undefined spaces">            </code><code class="comments">// Add current element to sum so far.</code></div><div class="line number22 index21 alt1"><code class="undefined spaces">            </code><code class="plain">currsum += arr[i];</code></div><div class="line number23 index22 alt2"><code class="undefined spaces"> </code> </div><div class="line number24 index23 alt1"><code class="undefined spaces">            </code><code class="comments">// If currsum is equal to desired sum,</code></div><div class="line number25 index24 alt2"><code class="undefined spaces">            </code><code class="comments">// then a new subarray is found. So</code></div><div class="line number26 index25 alt1"><code class="undefined spaces">            </code><code class="comments">// increase count of subarrays.</code></div><div class="line number27 index26 alt2"><code class="undefined spaces">            </code><code class="keyword">if</code> <code class="plain">(currsum == sum)</code></div><div class="line number28 index27 alt1"><code class="undefined spaces">                </code><code class="plain">res++;</code></div><div class="line number29 index28 alt2"><code class="undefined spaces"> </code> </div><div class="line number30 index29 alt1"><code class="undefined spaces">            </code><code class="comments">// currsum exceeds given sum by currsum</code></div><div class="line number31 index30 alt2"><code class="undefined spaces">            </code><code class="comments">//  - sum. Find number of subarrays having</code></div><div class="line number32 index31 alt1"><code class="undefined spaces">            </code><code class="comments">// this sum and exclude those subarrays</code></div><div class="line number33 index32 alt2"><code class="undefined spaces">            </code><code class="comments">// from currsum by increasing count by</code></div><div class="line number34 index33 alt1"><code class="undefined spaces">            </code><code class="comments">// same amount.</code></div><div class="line number35 index34 alt2"><code class="undefined spaces">            </code><code class="keyword">if</code> <code class="plain">(prevSum.has(currsum - sum))</code></div><div class="line number36 index35 alt1"><code class="undefined spaces">                </code><code class="plain">res += prevSum.get(currsum - sum);</code></div><div class="line number37 index36 alt2"><code class="undefined spaces"> </code> </div><div class="line number38 index37 alt1"><code class="undefined spaces">            </code><code class="comments">// Add currsum value to count of</code></div><div class="line number39 index38 alt2"><code class="undefined spaces">            </code><code class="comments">// different values of sum.</code></div><div class="line number40 index39 alt1"><code class="undefined spaces">            </code><code class="plain">let count = prevSum.get(currsum);</code></div><div class="line number41 index40 alt2"><code class="undefined spaces">            </code><code class="keyword">if</code> <code class="plain">(count == </code><code class="keyword">null</code><code class="plain">)</code></div><div class="line number42 index41 alt1"><code class="undefined spaces">                </code><code class="plain">prevSum.set(currsum, 1);</code></div><div class="line number43 index42 alt2"><code class="undefined spaces">            </code><code class="keyword">else</code></div><div class="line number44 index43 alt1"><code class="undefined spaces">                </code><code class="plain">prevSum.set(currsum, count + 1);</code></div><div class="line number45 index44 alt2"><code class="undefined spaces">        </code><code class="plain">} </code></div><div class="line number46 index45 alt1"><code class="undefined spaces">        </code><code class="keyword">return</code> <code class="plain">res;</code></div><div class="line number47 index46 alt2"><code class="undefined spaces">    </code><code class="plain">}</code></div><div class="line number48 index47 alt1"><code class="undefined spaces">    </code> </div><div class="line number49 index48 alt2"><code class="undefined spaces">    </code><code class="plain">let arr = [10, 2, -2, -20, 10];</code></div><div class="line number50 index49 alt1"><code class="undefined spaces">    </code><code class="plain">let sum = -10;</code></div><div class="line number51 index50 alt2"><code class="undefined spaces">    </code><code class="plain">let n = arr.length;</code></div><div class="line number52 index51 alt1"><code class="undefined spaces">    </code><code class="plain">document.write(findSubarraySum(arr, n, sum));</code></div><div class="line number53 index52 alt2"><code class="undefined spaces">    </code> </div><div class="line number54 index53 alt1"><code class="undefined spaces">    </code><code class="comments">// This code is contributed by avanitrachhadiya2155.</code></div><div class="line number55 index54 alt2"><code class="plain"></script></code></div></div></td></tr></tbody></table></div>


Output

3

Time Complexity: O(n) 
Auxiliary Space: O(n)



Last Updated : 31 Mar, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads