Check if an Array is made up of Subarrays of continuous repetitions of every distinct element
Last Updated :
03 Apr, 2023
Given an array arr[], consisting of N integers, the task is to check whether the entire array is only made up of subarrays such that each subarray consists of consecutive repetitions of a single element and every distinct element in the array is part of such subarray.
Examples:
Input: N = 10, arr[] = {1, 1, 1, 1, 2, 2, 3, 3, 3, 3}
Output: Yes
Explanation:
The given array consists of 3 distinct elements {1, 2, 3} and subarrays {1, 1, 1, 1}, {2, 2}, {3, 3, 3, 3}.
Therefore, the given array satisfies the conditions.
Input: N = 10, arr[] = {1, 1, 1, 2, 2, 2, 2, 1, 3, 3}
Output: No
Explanation:
The given array consists of 3 distinct elements {1, 2, 3} and subarrays {1, 1, 1}, {2, 2, 2, 2}, {1}, {3, 3}.
Since the subarray {1} does not contain any repetition, the given array does not satisfy the conditions.
Approach:
Follow the steps below to solve the problem:
- Initialize a variable curr = 0 to store the size of every subarray of a single repeating element is encountered.
- If any such index is found where arr[i] ? arr[i - 1], check if curr is greater than 1 or not. If so, reset curr to 0 and continue. Otherwise, print “No” as a subarray exists of a single element without repetition.
- Otherwise, increase curr.
- After traversing the array, check if curr is greater than 1 or not. If curr is equal to 1, this ensures that the last element is different from the second last element. Therefore, print “No”.
- Otherwise, print “Yes”.
Below is the implementation of the above approach:
C++
// C++ Program to implement
// the above problem
#include <bits/stdc++.h>
using namespace std;
// Function to check if the
// array is made up of
// subarrays of repetitions
bool ContinuousElements(int a[],
int n)
{
// Base Case
if (n == 1)
return false;
// Stores the size of
// current subarray
int curr = 1;
for (int i = 1; i < n; i++) {
// If a different element
// is encountered
if (a[i] != a[i - 1]) {
// If the previous subarray
// was a single element
if (curr == 1)
return false;
// Reset to new subarray
else
curr = 0;
}
// Increase size of subarray
curr++;
}
// If last element differed from
// the second last element
if (curr == 1)
return false;
return true;
}
// Driver code
int main()
{
int a[] = { 1, 1, 2, 2, 1, 3, 3 };
int n = sizeof(a)
/ sizeof(a[0]);
if (ContinuousElements(a, n))
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
Java
// Java Program to implement
// the above approach
class GFG{
// Function to check if the
// array is made up of
// subarrays of repetitions
static boolean ContinuousElements(int a[],
int n)
{
// Base Case
if (n == 1)
return false;
// Stores the size of
// current subarray
int curr = 1;
for (int i = 1; i < n; i++)
{
// If a different element
// is encountered
if (a[i] != a[i - 1])
{
// If the previous subarray
// was a single element
if (curr == 1)
return false;
// Reset to new subarray
else
curr = 0;
}
// Increase size of subarray
curr++;
}
// If last element differed from
// the second last element
if (curr == 1)
return false;
return true;
}
// Driver code
public static void main(String[] args)
{
int a[] = { 1, 1, 2, 2, 1, 3, 3 };
int n = a.length;
if (ContinuousElements(a, n))
System.out.println("Yes");
else
System.out.println("No");
}
}
// This code is contributed by rock_cool
Python3
# Python3 program to implement
# the above problem
# Function to check if the
# array is made up of
# subarrays of repetitions
def ContinuousElements(a, n):
# Base Case
if (n == 1):
return False
# Stores the size of
# current subarray
curr = 1
for i in range (1, n):
# If a different element
# is encountered
if (a[i] != a[i - 1]):
# If the previous subarray
# was a single element
if (curr == 1):
return False
# Reset to new subarray
else:
curr = 0
# Increase size of subarray
curr += 1
# If last element differed from
# the second last element
if (curr == 1):
return False
return True
# Driver code
if __name__ == "__main__":
a = [1, 1, 2, 2, 1, 3, 3]
n = len(a)
if (ContinuousElements(a, n)):
print ("Yes")
else:
print ("No")
# This code is contributed by Chitranayal
C#
// C# program to implement
// the above approach
using System;
class GFG{
// Function to check if the
// array is made up of
// subarrays of repetitions
static Boolean ContinuousElements(int []a,
int n)
{
// Base Case
if (n == 1)
return false;
// Stores the size of
// current subarray
int curr = 1;
for(int i = 1; i < n; i++)
{
// If a different element
// is encountered
if (a[i] != a[i - 1])
{
// If the previous subarray
// was a single element
if (curr == 1)
return false;
// Reset to new subarray
else
curr = 0;
}
// Increase size of subarray
curr++;
}
// If last element differed from
// the second last element
if (curr == 1)
return false;
return true;
}
// Driver code
public static void Main(String[] args)
{
int []a = { 1, 1, 2, 2, 1, 3, 3 };
int n = a.Length;
if (ContinuousElements(a, n))
Console.WriteLine("Yes");
else
Console.WriteLine("No");
}
}
// This code is contributed by shivanisinghss2110
JavaScript
<script>
// Javascript program to implement
// the above problem
// Function to check if the
// array is made up of
// subarrays of repetitions
function ContinuousElements(a, n)
{
// Base Case
if (n == 1)
return false;
// Stores the size of
// current subarray
let curr = 1;
for(let i = 1; i < n; i++)
{
// If a different element
// is encountered
if (a[i] != a[i - 1])
{
// If the previous subarray
// was a single element
if (curr == 1)
return false;
// Reset to new subarray
else
curr = 0;
}
// Increase size of subarray
curr++;
}
// If last element differed from
// the second last element
if (curr == 1)
return false;
return true;
}
// Driver code
let a = [ 1, 1, 2, 2, 1, 3, 3 ];
let n = a.length;
if (ContinuousElements(a, n))
document.write("Yes");
else
document.write("No");
// This code is contributed by divyesh072019
</script>
Time Complexity: O(N)
Auxiliary Space: O(1)
New Approach:- Another approach to solving this problem is to use a hash table to keep track of the frequency of each distinct element in the array. Then, we can iterate through the hash table and check if the frequency of any element is not equal to the length of any subarray made up of that element. If such an element exists, then the array is not made up of subarrays of continuous repetitions of every distinct element.
Here's the implementation of this approach:-
C++
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
bool checkSubarrays(int arr[], int n) {
unordered_map<int, int> freq;
// Count frequency of each distinct element
for (int i = 0; i < n; i++) {
freq[arr[i]]++;
}
// Check if frequency of each distinct element
// is equal to the length of any subarray made up
// of that element
for (auto it = freq.begin(); it != freq.end(); it++) {
int elem = it->first;
int count = it->second;
int len = 0;
for (int i = 0; i < n; i++) {
if (arr[i] == elem) {
len++;
} else {
if (len != count) {
return false;
}
len = 0;
}
}
if (len != count) {
return false;
}
}
return true;
}
int main() {
int arr[] = {1, 1, 2, 2, 1, 3, 3};
int n = sizeof(arr) / sizeof(arr[0]);
if (checkSubarrays(arr, n)) {
cout << "Yes\n";
} else {
cout << "No\n";
}
return 0;
}
Java
import java.util.*;
public class Main {
static boolean checkSubarrays(int[] arr, int n)
{
Map<Integer, Integer> freq = new HashMap<>();
// Count frequency of each distinct element
for (int i = 0; i < n; i++) {
freq.put(arr[i],
freq.getOrDefault(arr[i], 0) + 1);
}
// Check if frequency of each distinct element
// is equal to the length of any subarray made up
// of that element
for (Map.Entry<Integer, Integer> entry :
freq.entrySet()) {
int elem = entry.getKey();
int count = entry.getValue();
int len = 0;
for (int i = 0; i < n; i++) {
if (arr[i] == elem) {
len++;
}
else {
if (len != count) {
return false;
}
len = 0;
}
}
if (len != count) {
return false;
}
}
return true;
}
public static void main(String[] args)
{
int[] arr = { 1, 1, 2, 2, 1, 3, 3 };
int n = arr.length;
if (checkSubarrays(arr, n)) {
System.out.println("Yes");
}
else {
System.out.println("No");
}
}
}
JavaScript
function checkSubarrays(arr, n) {
const freq = new Map();
// Count frequency of each distinct element
for (let i = 0; i < n; i++) {
freq.set(arr[i], (freq.get(arr[i]) || 0) + 1);
}
// Check if frequency of each distinct element
// is equal to the length of any subarray made up
// of that element
for (const [elem, count] of freq.entries()) {
let len = 0;
for (let i = 0; i < n; i++) {
if (arr[i] === elem) {
len++;
} else {
if (len !== count) {
return false;
}
len = 0;
}
}
if (len !== count) {
return false;
}
}
return true;
}
const arr = [1, 1, 2, 2, 1, 3, 3];
const n = arr.length;
if (checkSubarrays(arr, n)) {
console.log("Yes");
} else {
console.log("No");
}
C#
using System;
using System.Collections.Generic;
public class Program {
public static bool CheckSubarrays(int[] arr, int n)
{
Dictionary<int, int> freq
= new Dictionary<int, int>();
// Count frequency of each distinct element
for (int i = 0; i < n; i++) {
if (!freq.ContainsKey(arr[i])) {
freq[arr[i]] = 1;
}
else {
freq[arr[i]]++;
}
}
// Check if frequency of each distinct element
// is equal to the length of any subarray made up
// of that element
foreach(var item in freq)
{
int elem = item.Key;
int count = item.Value;
int len = 0;
for (int i = 0; i < n; i++) {
if (arr[i] == elem) {
len++;
}
else {
if (len != count) {
return false;
}
len = 0;
}
}
if (len != count) {
return false;
}
}
return true;
}
public static void Main()
{
int[] arr = { 1, 1, 2, 2, 1, 3, 3 };
int n = arr.Length;
if (CheckSubarrays(arr, n)) {
Console.WriteLine("Yes");
}
else {
Console.WriteLine("No");
}
}
}
Python3
def checkSubarrays(arr, n):
freq = {}
# Count frequency of each distinct element
for i in range(n):
if arr[i] in freq:
freq[arr[i]] += 1
else:
freq[arr[i]] = 1
# Check if frequency of each distinct element
# is equal to the length of any subarray made up
# of that element
for elem, count in freq.items():
length = 0
for i in range(n):
if arr[i] == elem:
length += 1
else:
if length != count:
return False
length = 0
if length != count:
return False
return True
arr = [1, 1, 2, 2, 1, 3, 3]
n = len(arr)
if checkSubarrays(arr, n):
print("Yes")
else:
print("No")
Output:-
No
Time Complexity: O(n^2), where n is the length of the input array. This is because we are iterating over each distinct element in the array and then checking the length of all subarrays made up of that element. In the worst case, each element could be distinct, and there could be n such elements, leading to a time complexity of O(n^2).
Auxiliary Space: O(n), where n is the length of the input array. This is because we are using an unordered map to store the frequency of each distinct element, which can have at most n entries. Additionally, we are using a variable len to keep track of the length of the current subarray, which could be at most n. Therefore, the total space complexity is O(n + n) = O(n).
Similar Reads
DSA Tutorial - Learn Data Structures and Algorithms DSA (Data Structures and Algorithms) is the study of organizing data efficiently using data structures like arrays, stacks, and trees, paired with step-by-step procedures (or algorithms) to solve problems effectively. Data structures manage how data is stored and accessed, while algorithms focus on
7 min read
Quick Sort QuickSort is a sorting algorithm based on the Divide and Conquer that picks an element as a pivot and partitions the given array around the picked pivot by placing the pivot in its correct position in the sorted array. It works on the principle of divide and conquer, breaking down the problem into s
12 min read
Merge Sort - Data Structure and Algorithms Tutorials Merge sort is a popular sorting algorithm known for its efficiency and stability. It follows the divide-and-conquer approach. It works by recursively dividing the input array into two halves, recursively sorting the two halves and finally merging them back together to obtain the sorted array. Merge
14 min read
SQL Commands | DDL, DQL, DML, DCL and TCL Commands SQL commands are crucial for managing databases effectively. These commands are divided into categories such as Data Definition Language (DDL), Data Manipulation Language (DML), Data Control Language (DCL), Data Query Language (DQL), and Transaction Control Language (TCL). In this article, we will e
7 min read
Bubble Sort Algorithm Bubble Sort is the simplest sorting algorithm that works by repeatedly swapping the adjacent elements if they are in the wrong order. This algorithm is not suitable for large data sets as its average and worst-case time complexity are quite high.We sort the array using multiple passes. After the fir
8 min read
Data Structures Tutorial Data structures are the fundamental building blocks of computer programming. They define how data is organized, stored, and manipulated within a program. Understanding data structures is very important for developing efficient and effective algorithms. What is Data Structure?A data structure is a st
2 min read
Breadth First Search or BFS for a Graph Given a undirected graph represented by an adjacency list adj, where each adj[i] represents the list of vertices connected to vertex i. Perform a Breadth First Search (BFS) traversal starting from vertex 0, visiting vertices from left to right according to the adjacency list, and return a list conta
15+ min read
Binary Search Algorithm - Iterative and Recursive Implementation Binary Search Algorithm is a searching algorithm used in a sorted array by repeatedly dividing the search interval in half. The idea of binary search is to use the information that the array is sorted and reduce the time complexity to O(log N). Binary Search AlgorithmConditions to apply Binary Searc
15 min read
Insertion Sort Algorithm Insertion sort is a simple sorting algorithm that works by iteratively inserting each element of an unsorted list into its correct position in a sorted portion of the list. It is like sorting playing cards in your hands. You split the cards into two groups: the sorted cards and the unsorted cards. T
9 min read
Dijkstra's Algorithm to find Shortest Paths from a Source to all Given a weighted undirected graph represented as an edge list and a source vertex src, find the shortest path distances from the source vertex to all other vertices in the graph. The graph contains V vertices, numbered from 0 to V - 1.Note: The given graph does not contain any negative edge. Example
12 min read