Find Sum of All Unique Subarray Sums for a Given Array in C++



In this problem, we are given an array arr[] consisting of n integer values. Our task is to find the sum of all unique subarray sum for a given array. Subarray sum is the sum of elements of the given subarray.

Let's take an example to understand the problem,

Input : arr[] = {1, 2, 4} Output : 23

Explanation

All subarrays of the given array are : (1), (2), (4), (1, 2), (2, 4), (1, 2, 4) Sum of subarrays = 1 + 2 + 4 + (1+2) + (2+4) + (1+2+4) = 23

Solution Approach

A solution to the problem is by storing the subarray sum and then sorting them to find unique once. Then we will consider all unique subarrays for the sum.

Algorithm

Step 1 − Find the sum of all sub-arrays and store it in a vector.

Step 2 − Sort the vector.

Step 3 − Consider all the vectors which are unique and mark the sum of rest to 0.

Step 4 − Calculate and print the sum.

Example

Program to illustrate the working of our solution

#include <bits/stdc++.h> using namespace std; long int findSumOfSubArraySum(int arr[], int n){    int i, j;    long int sumArrayTill[n + 1] = { 0 };    for (i = 0; i < n; i++)       sumArrayTill[i + 1] = sumArrayTill[i] + arr[i];    vector<long int> subArraySum;    for (i = 1; i <= n; i++)       for (j = i; j <= n; j++)         subArraySum.push_back(sumArrayTill[j] - sumArrayTill[i - 1]);    sort(subArraySum.begin(), subArraySum.end());    for (i = 0; i < subArraySum.size() - 1; i++){       if (subArraySum[i] == subArraySum[i + 1]) {          j = i + 1;          while (subArraySum[j] == subArraySum[i] && j < subArraySum.size()){             subArraySum[j] = 0; j++;          }          subArraySum[i] = 0;       }    }    long sum = 0;    for (i = 0; i < subArraySum.size(); i++)       sum += subArraySum[i];    return sum; } int main(){ int arr[] = { 1, 2, 4, 7, 9 }; int n = sizeof(arr) / sizeof(arr[0]); cout<<"The sum of all unique subarray sum is "<<findSumOfSubArraySum(arr, n); return 0; }

Output

The sum of all unique subarray sum is 144

Another approach using Iteration

Another approach to solve the problem is using a hash table. We will find the subarray sums and store them in a hash table and increment hash count. Then find the sum of all unique subarrays (subarray with hash count 1).

Example

Program to illustrate the working of our solution

#include <bits/stdc++.h> using namespace std; long int findSumOfSubArraySum(int arr[], int n){    int sumSubArraySum = 0;    unordered_map<int, int> sumSubArray;    for (int i = 0; i < n; i++) {       int sum = 0;       for (int j = i; j < n; j++) {          sum += arr[j];          sumSubArray[sum]++;       }    }    for (auto itr : sumSubArray)       if (itr.second == 1)          sumSubArraySum += itr.first;       return sumSubArraySum; } int main(){ int arr[] = { 1, 2, 4, 7, 5 }; int n = sizeof(arr) / sizeof(arr[0]); cout<<"The sum of all unique subarray sum is "<<findSumOfSubArraySum(arr, n); return 0; }

Output

The sum of all unique subarray sum is 124
Updated on: 2022-01-25T14:17:49+05:30

693 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements
close