给定一个数组arr ,任务是找到给定数组的子数组的总数,这些子数组不包含任何元素总和为零的子数组。
例子:
Input: arr = {2, 4, -6}
Output: 5
Explanation:
There are 5 subarrays which do not contain any subarray whose elements sum is equal to zero: [2], [4], [-6], [2, 4], [4, -6]
Input: arr = {10, -10, 10}
Output: 3
方法:
- 首先将数组的所有元素存储为其前一个元素的总和。
- 现在取两个指针,增加第二个指针并将值存储在映射中,而不会遇到相同的元素。
- 如果遇到 map 中已经存在的元素,这意味着在两个元素总和等于 0 的指针之间存在一个子数组。
- 现在增加第一个指针并从地图中删除元素,同时存在两个相同的元素。
- 将答案存储在一个变量中并最终返回它。
下面是上述方法的实现:
C++
// C++ program to Count the no of subarray
// which do not contain any subarray
// whose sum of elements is equal to zero
#include
using namespace std;
// Function that print the number of
// subarrays which do not contain any subarray
// whose elements sum is equal to 0
void numberOfSubarrays(int arr[], int n)
{
vector v(n + 1);
v[0] = 0;
// Storing each element as sum
// of its previous element
for (int i = 0; i < n; i++) {
v[i + 1] = v[i] + arr[i];
}
map mp;
int begin = 0, end = 0, answer = 0;
mp[0] = 1;
while (begin < n) {
while (end < n
&& mp.find(v[end + 1])
== mp.end()) {
end++;
mp[v[end]] = 1;
}
// Check if another same element found
// this means a subarray exist between
// end and begin whose sum
// of elements is equal to 0
answer = answer + end - begin;
// Erase beginning element from map
mp.erase(v[begin]);
// Increase begin
begin++;
}
// Print the result
cout << answer << endl;
}
// Driver Code
int main()
{
int arr[] = { 2, 4, -6 };
int size = sizeof(arr) / sizeof(arr[0]);
numberOfSubarrays(arr, size);
return 0;
}
Java
// Java program to Count the no of subarray
// which do not contain any subarray
// whose sum of elements is equal to zero
import java.util.*;
class GFG{
// Function that print the number of
// subarrays which do not contain any subarray
// whose elements sum is equal to 0
static void numberOfSubarrays(int arr[], int n)
{
int []v = new int[n + 1];
v[0] = 0;
// Storing each element as sum
// of its previous element
for (int i = 0; i < n; i++) {
v[i + 1] = v[i] + arr[i];
}
HashMap mp = new HashMap();
int begin = 0, end = 0, answer = 0;
mp.put(0, 1);
while (begin < n) {
while (end < n
&& !mp.containsKey(v[end + 1])) {
end++;
mp.put(v[end], 1);
}
// Check if another same element found
// this means a subarray exist between
// end and begin whose sum
// of elements is equal to 0
answer = answer + end - begin;
// Erase beginning element from map
mp.remove(v[begin]);
// Increase begin
begin++;
}
// Print the result
System.out.print(answer +"\n");
}
// Driver Code
public static void main(String[] args)
{
int arr[] = { 2, 4, -6 };
int size = arr.length;
numberOfSubarrays(arr, size);
}
}
// This code is contributed by sapnasingh4991
Python3
# Python 3 program to Count the no of subarray
# which do not contain any subarray
# whose sum of elements is equal to zero
# Function that print the number of
# subarrays which do not contain any subarray
# whose elements sum is equal to 0
def numberOfSubarrays(arr, n):
v = [0]*(n + 1)
# Storing each element as sum
# of its previous element
for i in range( n):
v[i + 1] = v[i] + arr[i]
mp = {}
begin, end, answer = 0 , 0 , 0
mp[0] = 1
while (begin < n):
while (end < n
and (v[end + 1]) not in mp):
end += 1
mp[v[end]] = 1
# Check if another same element found
# this means a subarray exist between
# end and begin whose sum
# of elements is equal to 0
answer = answer + end - begin
# Erase beginning element from map
del mp[v[begin]]
# Increase begin
begin += 1
# Print the result
print(answer)
# Driver Code
if __name__ == "__main__":
arr = [ 2, 4, -6 ]
size = len(arr)
numberOfSubarrays(arr, size)
# This code is contributed by chitranayal
C#
// C# program to Count the no of subarray
// which do not contain any subarray
// whose sum of elements is equal to zero
using System;
using System.Collections.Generic;
class GFG{
// Function that print the number of
// subarrays which do not contain any subarray
// whose elements sum is equal to 0
static void numberOfSubarrays(int []arr, int n)
{
int []v = new int[n + 1];
v[0] = 0;
// Storing each element as sum
// of its previous element
for (int i = 0; i < n; i++) {
v[i + 1] = v[i] + arr[i];
}
Dictionary mp = new Dictionary();
int begin = 0, end = 0, answer = 0;
mp.Add(0, 1);
while (begin < n) {
while (end < n
&& !mp.ContainsKey(v[end + 1])) {
end++;
mp.Add(v[end], 1);
}
// Check if another same element found
// this means a subarray exist between
// end and begin whose sum
// of elements is equal to 0
answer = answer + end - begin;
// Erase beginning element from map
mp.Remove(v[begin]);
// Increase begin
begin++;
}
// Print the result
Console.Write(answer +"\n");
}
// Driver Code
public static void Main(String[] args)
{
int []arr = { 2, 4, -6 };
int size = arr.Length;
numberOfSubarrays(arr, size);
}
}
// This code is contributed by Rajput-Ji
Javascript
输出:
5
如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live