Number of sub-arrays that have at least one duplicate

Given an array arr of n elements, the task is to find the number of the sub-arrays of the given array that contain at least one duplicate element.

Examples:

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}

Approach:

  • First find the total number of sub-arrays that can be formed from the array and denote this by total then total = (n*(n+1))/2.
  • Now find the sub-arrays that have all the elements distinct (can be found out using window sliding technique) and denote this by unique.
  • Finally, the number of sub-arrays that have at least one element duplicate are (total – unique)

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
#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<ll, ll> 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;
}

chevron_right


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

Output:

3


My Personal Notes arrow_drop_up