Count subarrays having a single distinct element that can be obtained from a given array
Last Updated :
17 May, 2021
Given an array arr[] of size N, the task is to count the number of subarrays consisting of a single distinct element that can be obtained from a given array.
Examples:
Input: N = 4, arr[] = { 2, 2, 2, 2 }
Output: 7
Explanation: All such subarrays {{2}, {2}, {2}, {2}, {2, 2}, {2, 2, 2}, {2, 2, 2, 2}}. Therefore, total count of such subarrays are 7.
Input: N = 3, arr[] = { 1, 1, 3 }
Output: 4
Approach: Follow the steps below to solve the problem:
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void divisionalArrays( int arr[3], int N)
{
int sum = N;
unordered_map< int , int > mp;
for ( int i = 0; i < N; i++) {
mp[arr[i]]++;
}
for ( auto x : mp) {
if (x.second > 1) {
sum += x.second - 1;
}
}
cout << sum << endl;
}
int main()
{
int arr[] = { 1, 1, 3 };
int N = sizeof (arr)
/ sizeof (arr[0]);
divisionalArrays(arr, N);
}
|
Java
import java.io.*;
import java.util.*;
class GFG
{
static void divisionalArrays( int arr[], int N)
{
int sum = N;
HashMap<Integer, Integer> mp
= new HashMap<Integer, Integer>();
for ( int i = 0 ; i < N; i++)
{
if (mp.containsKey(arr[i]))
{
mp.put(arr[i], mp.get(arr[i]) + 1 );
}
else
{
mp.put(arr[i], 1 );
}
}
for (Map.Entry x : mp.entrySet())
{
if (( int )x.getValue() > 1 )
{
sum += ( int )x.getValue() - 1 ;
}
}
System.out.println(sum);
}
public static void main(String[] args)
{
int arr[] = { 1 , 1 , 3 };
int N = arr.length;
divisionalArrays(arr, N);
}
}
|
Python3
from collections import defaultdict
def divisionalArrays(arr, N):
sum = N
mp = defaultdict( int )
for i in range (N):
mp[arr[i]] + = 1
for x in mp:
if (mp[x] > 1 ):
sum + = mp[x] - 1
print ( sum )
if __name__ = = "__main__" :
arr = [ 1 , 1 , 3 ]
N = len (arr)
divisionalArrays(arr, N)
|
C#
using System;
using System.Collections.Generic;
class GFG{
static void divisionalArrays( int []arr, int N)
{
int sum = N;
Dictionary< int ,
int > mp = new Dictionary< int ,
int >();
for ( int i = 0; i < N; i++)
{
if (mp.ContainsKey(arr[i]))
{
mp[arr[i]] = mp[arr[i]] + 1;
}
else
{
mp.Add(arr[i], 1);
}
}
foreach (KeyValuePair< int , int > x in mp)
{
if (( int )x.Value > 1)
{
sum += ( int )x.Value - 1;
}
}
Console.WriteLine(sum);
}
public static void Main(String[] args)
{
int []arr = { 1, 1, 3 };
int N = arr.Length;
divisionalArrays(arr, N);
}
}
|
Javascript
<script>
function divisionalArrays(arr, N)
{
var sum = N;
var mp = new Map();
for ( var i = 0; i < N; i++) {
if (mp.has(arr[i]))
{
mp.set(arr[i], mp.get(arr[i])+1);
}
else
{
mp.set(arr[i],1);
}
}
mp.forEach((value, key) => {
if (value > 1) {
sum += value - 1;
}
});
document.write( sum);
}
var arr =[1, 1, 3];
var N = arr.length;
divisionalArrays(arr, N);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Share your thoughts in the comments
Please Login to comment...