至少有一个重复的子数组的数量
给定一个包含 n 个元素的数组arr ,任务是找出给定数组中至少包含一个重复元素的子数组的数量。
例子:
Input: arr[] = {1, 2, 3}
Output: 0
There is no sub-array with duplicate elements.
Input: arr[] = {4, 3, 4, 3}
Output: 3
Possible sub-arrays are {4, 3, 4}, {4, 3, 4, 3} and {3, 4, 3}
方法:
- 首先,找到可以从数组中形成的子数组的总数,并用total然后total = (n*(n+1))/2来表示。
- 现在找到所有元素都不同的子数组(可以使用窗口滑动技术找到)并用unique表示。
- 最后,至少有一个元素重复的子数组的数量是(总 - 唯一)
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
#define ll long long int
using namespace std;
// Function to return the count of the
// sub-arrays that have at least one duplicate
ll count(ll arr[], ll n)
{
ll unique = 0;
// two pointers
ll i = -1, j = 0;
// to store frequencies of the numbers
unordered_map freq;
for (j = 0; j < n; j++) {
freq[arr[j]]++;
// number is not distinct
if (freq[arr[j]] >= 2) {
i++;
while (arr[i] != arr[j]) {
freq[arr[i]]--;
i++;
}
freq[arr[i]]--;
unique = unique + (j - i);
}
else
unique = unique + (j - i);
}
ll total = n * (n + 1) / 2;
return total - unique;
}
// Driver code
int main()
{
ll arr[] = { 4, 3, 4, 3 };
ll n = sizeof(arr) / sizeof(arr[0]);
cout << count(arr, n) << endl;
return 0;
}
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
// Function to return the count of the
// sub-arrays that have at least one duplicate
static Integer count(Integer arr[], Integer n)
{
Integer unique = 0;
// two pointers
Integer i = -1, j = 0;
// to store frequencies of the numbers
Map freq = new HashMap<>();
for (j = 0; j < n; j++)
{
if(freq.containsKey(arr[j]))
{
freq.put(arr[j], freq.get(arr[j]) + 1);
}
else
{
freq.put(arr[j], 1);
}
// number is not distinct
if (freq.get(arr[j]) >= 2)
{
i++;
while (arr[i] != arr[j])
{
freq.put(arr[i], freq.get(arr[i]) - 1);
i++;
}
freq.put(arr[i], freq.get(arr[i]) - 1);
unique = unique + (j - i);
}
else
unique = unique + (j - i);
}
Integer total = n * (n + 1) / 2;
return total - unique;
}
// Driver code
public static void main(String[] args)
{
Integer arr[] = { 4, 3, 4, 3 };
Integer n = arr.length;
System.out.println(count(arr, n));
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 implementation of the approach
from collections import defaultdict
# Function to return the count of the
# sub-arrays that have at least one duplicate
def count(arr, n):
unique = 0
# two pointers
i, j = -1, 0
# to store frequencies of the numbers
freq = defaultdict(lambda:0)
for j in range(0, n):
freq[arr[j]] += 1
# number is not distinct
if freq[arr[j]] >= 2:
i += 1
while arr[i] != arr[j]:
freq[arr[i]] -= 1
i += 1
freq[arr[i]] -= 1
unique = unique + (j - i)
else:
unique = unique + (j - i)
total = (n * (n + 1)) // 2
return total - unique
# Driver Code
if __name__ == "__main__":
arr = [4, 3, 4, 3]
n = len(arr)
print(count(arr, n))
# This code is contributed
# by Rituraj Jain
C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
class GFG
{
// Function to return the count of the
// sub-arrays that have at least one duplicate
static int count(int []arr, int n)
{
int unique = 0;
// two pointers
int i = -1, j = 0;
// to store frequencies of the numbers
Dictionary freq = new Dictionary();
for (j = 0; j < n; j++)
{
if(freq.ContainsKey(arr[j]))
{
freq[arr[j]] = freq[arr[j]] + 1;
}
else
{
freq.Add(arr[j], 1);
}
// number is not distinct
if (freq[arr[j]] >= 2)
{
i++;
while (arr[i] != arr[j])
{
freq[arr[i]] = freq[arr[i]] - 1;
i++;
}
freq[arr[i]] = freq[arr[i]] - 1;
unique = unique + (j - i);
}
else
unique = unique + (j - i);
}
int total = n * (n + 1) / 2;
return total - unique;
}
// Driver code
public static void Main(String[] args)
{
int []arr = { 4, 3, 4, 3 };
int n = arr.Length;
Console.WriteLine(count(arr, n));
}
}
// This code is contributed by PrinciRaj1992
Javascript
输出:
3
时间复杂度: O(N)
辅助空间: O(N)