-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathZeroSumSubarray.cpp
More file actions
68 lines (57 loc) · 1.49 KB
/
Copy pathZeroSumSubarray.cpp
File metadata and controls
68 lines (57 loc) · 1.49 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/* GFG
You are given an array arr[] of size n. Find the total count of sub-arrays having their sum equal to 0.
Example 1:
Input:
n = 6
arr[] = {0,0,5,5,0,0}
Output: 6
Explanation: The 6 subarrays are
[0], [0], [0], [0], [0,0], and [0,0].
Example 2:
Input:
n = 10
arr[] = {6,-1,-3,4,-2,2,4,6,-12,-7}
Output: 4
Explanation: The 4 subarrays are [-1 -3 4]
[-2 2], [2 4 6 -12], and [-1 -3 4 -2 2]
Your Task:
You don't need to read input or print anything. Complete the function findSubarray() that takes the array arr and its size n as input parameters and returns the total number of sub-arrays with 0 sum.
Expected Time Complexity : O(n)
Expected Auxilliary Space : O(n)
Constraints:
1<= n <= 107
-1010 <= arri <= 1010
*/
typedef long long int ll;
class Solution{
public:
//Function to count subarrays with sum equal to 0.
ll findSubarray(vector<ll> arr, int n ) {
//code here
unordered_map<ll,ll> m;
ll sum=0;
ll *sum_arr=(ll *)malloc(n*sizeof(ll));
ll ans=0;
for(int i=n-1;i>=0;i--)
{
sum+=arr[i];
sum_arr[i]=sum;
auto it=m.find(sum);
if(it==m.end())
m.insert({sum,1});
else
it->second++;
}
ll el=0;
if(m.find(0)!=m.end())
ans+=m[0];
for(int i=n-1;i>=0;i--)
{
el=sum_arr[i];
m[el]--;
ans+=m[el];
}
free(sum_arr);
return ans;
}
};