TheAlgorithms/C++ 1.0.0
All the algorithms implemented in C++
Loading...
Searching...
No Matches
subarray_sum.cpp File Reference

Subset-sum (only continuous subsets) problem More...

#include <cassert>
#include <cstdint>
#include <iostream>
#include <unordered_map>
#include <vector>
Include dependency graph for subarray_sum.cpp:

Go to the source code of this file.

Namespaces

namespace  backtracking
 for vector container
 
namespace  subarray_sum
 Functions for the Subset sum implementation.
 

Functions

uint64_t backtracking::subarray_sum::subarray_sum (int64_t sum, const std::vector< int64_t > &in_arr)
 The main function that implements the count of the subarrays.
 
static void test ()
 Self-test implementations.
 
int main ()
 Main function.
 

Detailed Description

Subset-sum (only continuous subsets) problem

We are given an array and a sum value. The algorithms find all the subarrays of that array with sum equal to the given sum and return such subarrays count. This approach will have \(O(n)\) time complexity and \(O(n)\) space complexity. NOTE: In this problem, we are only referring to the continuous subsets as subarrays everywhere. Subarrays can be created using deletion operation at the end of the front of an array only. The parent array is also counted in subarrays having 0 number of deletion operations.

Author
Swastika Gupta

Definition in file subarray_sum.cpp.

Function Documentation

◆ main()

int main ( void )

Main function.

Returns
0 on exit

Definition at line 115 of file subarray_sum.cpp.

115 {
116 test(); // run self-test implementations
117 return 0;
118}
static void test()
Self-test implementations.

◆ subarray_sum()

uint64_t backtracking::subarray_sum::subarray_sum ( int64_t sum,
const std::vector< int64_t > & in_arr )

The main function that implements the count of the subarrays.

Parameters
sumis the required sum of any subarrays
in_arris the input array
Returns
count of the number of subsets with required sum

Definition at line 39 of file subarray_sum.cpp.

39 {
40 int64_t nelement = in_arr.size();
41 int64_t count_of_subset = 0;
42 int64_t current_sum = 0;
43 std::unordered_map<int64_t, int64_t>
44 sumarray; // to store the subarrays count
45 // frequency having some sum value
46
47 for (int64_t i = 0; i < nelement; i++) {
48 current_sum += in_arr[i];
49
50 if (current_sum == sum) {
51 count_of_subset++;
52 }
53 // If in case current_sum is greater than the required sum
54 if (sumarray.find(current_sum - sum) != sumarray.end()) {
55 count_of_subset += (sumarray[current_sum - sum]);
56 }
57 sumarray[current_sum]++;
58 }
59 return count_of_subset;
60}
T sum(const std::vector< std::valarray< T > > &A)

◆ test()

static void test ( )
static

Self-test implementations.

Returns
void

Definition at line 68 of file subarray_sum.cpp.

68 {
69 // 1st test
70 std::cout << "1st test ";
71 std::vector<int64_t> array1 = {-7, -3, -2, 5, 8}; // input array
72 assert(
73 backtracking::subarray_sum::subarray_sum(0, array1) ==
74 1); // first argument in subarray_sum function is the required sum and
75 // second is the input array, answer is the subarray {(-3,-2,5)}
76 std::cout << "passed" << std::endl;
77
78 // 2nd test
79 std::cout << "2nd test ";
80 std::vector<int64_t> array2 = {1, 2, 3, 3};
81 assert(backtracking::subarray_sum::subarray_sum(6, array2) ==
82 2); // here we are expecting 2 subsets which sum up to 6 i.e.
83 // {(1,2,3),(3,3)}
84 std::cout << "passed" << std::endl;
85
86 // 3rd test
87 std::cout << "3rd test ";
88 std::vector<int64_t> array3 = {1, 1, 1, 1};
89 assert(backtracking::subarray_sum::subarray_sum(1, array3) ==
90 4); // here we are expecting 4 subsets which sum up to 1 i.e.
91 // {(1),(1),(1),(1)}
92 std::cout << "passed" << std::endl;
93
94 // 4rd test
95 std::cout << "4th test ";
96 std::vector<int64_t> array4 = {3, 3, 3, 3};
97 assert(backtracking::subarray_sum::subarray_sum(6, array4) ==
98 3); // here we are expecting 3 subsets which sum up to 6 i.e.
99 // {(3,3),(3,3),(3,3)}
100 std::cout << "passed" << std::endl;
101
102 // 5th test
103 std::cout << "5th test ";
104 std::vector<int64_t> array5 = {};
105 assert(backtracking::subarray_sum::subarray_sum(6, array5) ==
106 0); // here we are expecting 0 subsets which sum up to 6 i.e. we
107 // cannot select anything from an empty array
108 std::cout << "passed" << std::endl;
109}