# Count of subarrays which start and end with the same element

• Difficulty Level : Easy
• Last Updated : 11 Jul, 2022

Given an array A of size N where the array elements contain values from 1 to N with duplicates, the task is to find the total number of subarrays that start and end with the same element.

Examples:

Input: A[] = {1, 2, 1, 5, 2}
Output:
Explanation:
Total 7 sub-array of the given array are {1}, {2}, {1}, {5}, {2}, {1, 2, 1} and {2, 1, 5, 2} are start and end with same element.
Input: A[] = {1, 5, 6, 1, 9, 5, 8, 10, 8, 9}
Output: 14
Explanation:
Total 14 sub-array {1}, {5}, {6}, {1}, {9}, {5}, {8}, {10}, {8}, {9}, {1, 5, 6, 1}, {5, 6, 1, 9, 5}, {9, 5, 8, 10, 8, 9} and {8, 10, 8} start and end with same element.

Naive approach: For each element in the array, if it is present at a different index as well, we will increase our result by 1. Also, all 1-size subarray are part of counted in the result. Therefore, add N to the result.

Below is the implementation of the above approach:

## C++

 `// C++ program to Count total sub-array``// which start and end with same element`` ` `#include ``using` `namespace` `std;`` ` `// Function to find total sub-array``// which start and end with same element``void` `cntArray(``int` `A[], ``int` `N)``{``    ``// initialize result with 0``    ``int` `result = 0;`` ` `    ``for` `(``int` `i = 0; i < N; i++) {`` ` `        ``// all size 1 sub-array``        ``// is part of our result``        ``result++;`` ` `        ``// element at current index``        ``int` `current_value = A[i];`` ` `        ``for` `(``int` `j = i + 1; j < N; j++) {`` ` `            ``// Check if A[j] = A[i]``            ``// increase result by 1``            ``if` `(A[j] == current_value) {``                ``result++;``            ``}``        ``}``    ``}`` ` `    ``// print the result``    ``cout << result << endl;``}`` ` `// Driver code``int` `main()``{``    ``int` `A[] = { 1, 5, 6, 1, 9,``                ``5, 8, 10, 8, 9 };``    ``int` `N = ``sizeof``(A) / ``sizeof``(``int``);`` ` `    ``cntArray(A, N);`` ` `    ``return` `0;``}`

## Java

 `// Java program to Count total sub-array``// which start and end with same element`` ` `public` `class` `Main {`` ` `    ``// function to find total sub-array``    ``// which start and end with same element``    ``public` `static` `void` `cntArray(``int` `A[], ``int` `N)``    ``{``        ``// initialize result with 0``        ``int` `result = ``0``;`` ` `        ``for` `(``int` `i = ``0``; i < N; i++) {`` ` `            ``// all size 1 sub-array``            ``// is part of our result``            ``result++;`` ` `            ``// element at current index``            ``int` `current_value = A[i];`` ` `            ``for` `(``int` `j = i + ``1``; j < N; j++) {`` ` `                ``// Check if A[j] = A[i]``                ``// increase result by 1``                ``if` `(A[j] == current_value) {``                    ``result++;``                ``}``            ``}``        ``}`` ` `        ``// print the result``        ``System.out.println(result);``    ``}`` ` `    ``// Driver code``    ``public` `static` `void` `main(String[] args)``    ``{``        ``int``[] A = { ``1``, ``5``, ``6``, ``1``, ``9``,``                    ``5``, ``8``, ``10``, ``8``, ``9` `};``        ``int` `N = A.length;``        ``cntArray(A, N);``    ``}``}`

## Python3

 `# Python3 program to count total sub-array ``# which start and end with same element `` ` `# Function to find total sub-array ``# which start and end with same element ``def` `cntArray(A, N): `` ` `    ``# Initialize result with 0 ``    ``result ``=` `0`` ` `    ``for` `i ``in` `range``(``0``, N): `` ` `        ``# All size 1 sub-array ``        ``# is part of our result ``        ``result ``=` `result ``+` `1`` ` `        ``# Element at current index ``        ``current_value ``=` `A[i]`` ` `        ``for` `j ``in` `range``(i ``+` `1``, N): `` ` `            ``# Check if A[j] = A[i] ``            ``# increase result by 1 ``            ``if` `(A[j] ``=``=` `current_value): ``                ``result ``=` `result ``+` `1`` ` `    ``# Print the result ``    ``print``(result)``    ``print``(``"\n"``)`` ` `# Driver code ``A ``=` `[ ``1``, ``5``, ``6``, ``1``, ``9``, ``5``, ``8``, ``10``, ``8``, ``9` `] ``N ``=` `len``(A)`` ` `cntArray(A, N)`` ` `# This code is contributed by PratikBasu `

## C#

 `// C# program to Count total sub-array``// which start and end with same element``using` `System;``class` `GFG{`` ` `// function to find total sub-array``// which start and end with same element``public` `static` `void` `cntArray(``int` `[]A, ``int` `N)``{``    ``// initialize result with 0``    ``int` `result = 0;`` ` `    ``for` `(``int` `i = 0; i < N; i++) ``    ``{`` ` `        ``// all size 1 sub-array``        ``// is part of our result``        ``result++;`` ` `        ``// element at current index``        ``int` `current_value = A[i];`` ` `        ``for` `(``int` `j = i + 1; j < N; j++) ``        ``{`` ` `            ``// Check if A[j] = A[i]``            ``// increase result by 1``            ``if` `(A[j] == current_value) ``            ``{``                ``result++;``            ``}``        ``}``    ``}`` ` `    ``// print the result``    ``Console.Write(result);``}`` ` `// Driver code``public` `static` `void` `Main()``{``    ``int``[] A = { 1, 5, 6, 1, 9,``                ``5, 8, 10, 8, 9 };``    ``int` `N = A.Length;``    ``cntArray(A, N);``}``}`` ` `// This code is contributed by Code_Mech`

## Javascript

 ``

Output:

`14`

Time Complexity: O(N2), where N is the size of the array
Space complexity: O(1)

Efficient approach: We can optimize the above method by observing that the answer just depends on frequencies of numbers in the original array.
For example in array {1, 5, 6, 1, 9, 5, 8, 10, 8, 9}, frequency of 1 is 2 and sub-array contributing to answer are {1}, {1} and {1, 5, 6, 1} respectively, i.e., a total of 3.
Therefore, calculate the frequency of each element in the array. Then for each element, the increment the count by the result yielded by the following formula:

((frequency of element)*(frequency of element + 1)) / 2

Below is the implementation of the above approach:

## C++

 `// C++ program to Count total sub-array``// which start and end with same element`` ` `#include ``using` `namespace` `std;`` ` `// function to find total sub-array``// which start and end with same element``void` `cntArray(``int` `A[], ``int` `N)``{``    ``// initialize result with 0``    ``int` `result = 0;`` ` `    ``// array to count frequency of 1 to N``    ``int` `frequency[N + 1] = { 0 };`` ` `    ``for` `(``int` `i = 0; i < N; i++) {``        ``// update frequency of A[i]``        ``frequency[A[i]]++;``    ``}`` ` `    ``for` `(``int` `i = 1; i <= N; i++) {``        ``int` `frequency_of_i = frequency[i];`` ` `        ``// update result with sub-array``        ``// contributed by number i``        ``result += +((frequency_of_i)``                    ``* (frequency_of_i + 1))``                  ``/ 2;``    ``}`` ` `    ``// print the result``    ``cout << result << endl;``}`` ` `// Driver code``int` `main()``{``    ``int` `A[] = { 1, 5, 6, 1, 9, 5,``                ``8, 10, 8, 9 };``    ``int` `N = ``sizeof``(A) / ``sizeof``(``int``);`` ` `    ``cntArray(A, N);`` ` `    ``return` `0;``}`

## Java

 `// Java program to Count total sub-array``// which start and end with same element`` ` `public` `class` `Main {`` ` `    ``// function to find total sub-array which``    ``// start and end with same element``    ``public` `static` `void` `cntArray(``int` `A[], ``int` `N)``    ``{``        ``// initialize result with 0``        ``int` `result = ``0``;`` ` `        ``// array to count frequency of 1 to N``        ``int``[] frequency = ``new` `int``[N + ``1``];`` ` `        ``for` `(``int` `i = ``0``; i < N; i++) {``            ``// update frequency of A[i]``            ``frequency[A[i]]++;``        ``}`` ` `        ``for` `(``int` `i = ``1``; i <= N; i++) {``            ``int` `frequency_of_i = frequency[i];`` ` `            ``// update result with sub-array``            ``// contributed by number i``            ``result += ((frequency_of_i)``                       ``* (frequency_of_i + ``1``))``                      ``/ ``2``;``        ``}`` ` `        ``// print the result``        ``System.out.println(result);``    ``}`` ` `    ``// Driver code``    ``public` `static` `void` `main(String[] args)``    ``{`` ` `        ``int``[] A = { ``1``, ``5``, ``6``, ``1``, ``9``, ``5``,``                    ``8``, ``10``, ``8``, ``9` `};``        ``int` `N = A.length;``        ``cntArray(A, N);``    ``}``}`

## Python3

 `# Python3 program to count total sub-array ``# which start and end with same element `` ` `# Function to find total sub-array ``# which start and end with same element ``def` `cntArray(A, N): `` ` `    ``# Initialize result with 0 ``    ``result ``=` `0`` ` `    ``# Array to count frequency of 1 to N ``    ``frequency ``=` `[``0``] ``*` `(N ``+` `1``) `` ` `    ``for` `i ``in` `range``(``0``, N):``         ` `        ``# Update frequency of A[i] ``        ``frequency[A[i]] ``=` `frequency[A[i]] ``+` `1`` ` `    ``for` `i ``in` `range``(``1``, N ``+` `1``): ``        ``frequency_of_i ``=` `frequency[i]`` ` `        ``# Update result with sub-array ``        ``# contributed by number i ``        ``result ``=` `result ``+` `((frequency_of_i) ``*``                           ``(frequency_of_i ``+` `1``)) ``/` `2`` ` `    ``# Print the result ``    ``print``(``int``(result))``    ``print``(``"\n"``)`` ` `# Driver code ``A ``=` `[ ``1``, ``5``, ``6``, ``1``, ``9``, ``5``, ``8``, ``10``, ``8``, ``9` `]``N ``=` `len``(A)`` ` `cntArray(A, N) `` ` `# This code is contributed by PratikBasu `

## C#

 `// C# program to Count total sub-array``// which start and end with same element``using` `System;``class` `GFG{`` ` `// function to find total sub-array which``// start and end with same element``public` `static` `void` `cntArray(``int` `[]A, ``int` `N)``{``    ``// initialize result with 0``    ``int` `result = 0;`` ` `    ``// array to count frequency of 1 to N``    ``int``[] frequency = ``new` `int``[N + 1];`` ` `    ``for` `(``int` `i = 0; i < N; i++) ``    ``{``        ``// update frequency of A[i]``        ``frequency[A[i]]++;``    ``}`` ` `    ``for` `(``int` `i = 1; i <= N; i++) ``    ``{``        ``int` `frequency_of_i = frequency[i];`` ` `        ``// update result with sub-array``        ``// contributed by number i``        ``result += ((frequency_of_i) * ``                   ``(frequency_of_i + 1)) / 2;``    ``}`` ` `    ``// print the result``    ``Console.Write(result);``}`` ` `// Driver code``public` `static` `void` `Main()``{``    ``int``[] A = { 1, 5, 6, 1, 9, 5,``                ``8, 10, 8, 9 };``    ``int` `N = A.Length;``    ``cntArray(A, N);``}``}`` ` `// This code is contributed by Nidhi_Biet`

## Javascript

 ``

Output:

`14`

Time Complexity: O(N), where N is the size of the array
Space complexity: O(N)

Related Topic: Subarrays, Subsequences, and Subsets in Array

My Personal Notes arrow_drop_up