Count of Subarrays in an array containing numbers from 1 to the length of subarray
Given an array arr[] of length N containing all elements from 1 to N, the task is to find the number of sub-arrays that contain numbers from 1 to M, where M is the length of the sub-array.
Examples:
Input: arr[] = {4, 1, 3, 2, 5, 6}
Output: 5
Explanation:
Desired Sub-arrays = { {4, 1, 3, 2}, {1}, {1, 3, 2}, {4, 1, 3, 2, 5}, {4, 1, 3, 2, 5, 6} }
Count(Sub-arrays) = 5
Input: arr[] = {3, 2, 4, 1}
Output: 2
Explanation:
Desired Sub-arrays = { {1}, {3, 2, 4, 1} }
Count(Sub-arrays) = 2
Naive Approach: Generate all subarrays of the array and check for each subarray that it contains each element 1 to the length of the subarray.
Efficient Approach: Create a vector that maps each element of the array with its index in sorted order. Now iterate over this vector and check whether the difference of maximum and minimum index till the ith element is less than the number of elements iterated till now, which is the value of i itself.
Below is the implementation of the above approach
C++
#include <bits/stdc++.h>
using namespace std;
int countOfSubarrays( int * arr, int n)
{
int count = 0;
vector< int > v(n + 1);
for ( int i = 0; i < n; i++)
v[arr[i]] = i;
int maximum = INT_MIN;
int minimum = INT_MAX;
for ( int i = 1; i <= n; i++) {
maximum = max(maximum, v[i]);
minimum = min(minimum, v[i]);
if (maximum - minimum < i)
count = count + 1;
}
return count;
}
int main()
{
int arr[] = { 4, 1, 3, 2, 5, 6 };
int n = sizeof (arr) / sizeof (arr[0]);
cout << countOfSubarrays(arr, n) << endl;
return 0;
}
|
Java
class GFG
{
static int countOfSubarrays( int []arr, int n)
{
int count = 0 ;
int []v = new int [n + 1 ];
for ( int i = 0 ; i < n; i++)
v[arr[i]] = i;
int maximum = Integer.MIN_VALUE;
int minimum = Integer.MAX_VALUE;
for ( int i = 1 ; i <= n; i++)
{
maximum = Math.max(maximum, v[i]);
minimum = Math.min(minimum, v[i]);
if (maximum - minimum < i)
count = count + 1 ;
}
return count;
}
public static void main(String[] args)
{
int arr[] = { 4 , 1 , 3 , 2 , 5 , 6 };
int n = arr.length;
System.out.print(countOfSubarrays(arr, n) + "\n" );
}
}
|
Python3
import sys
INT_MAX = sys.maxsize;
INT_MIN = - (sys.maxsize - 1 );
def countOfSubarrays(arr, n) :
count = 0 ;
v = [ 0 ] * (n + 1 );
for i in range (n) :
v[arr[i]] = i;
maximum = INT_MIN;
minimum = INT_MAX;
for i in range ( 1 , n + 1 ) :
maximum = max (maximum, v[i]);
minimum = min (minimum, v[i]);
if (maximum - minimum < i) :
count = count + 1 ;
return count;
if __name__ = = "__main__" :
arr = [ 4 , 1 , 3 , 2 , 5 , 6 ];
n = len (arr);
print (countOfSubarrays(arr, n));
|
C#
using System;
class GFG
{
static int countOfSubarrays( int []arr, int n)
{
int count = 0;
int []v = new int [n + 1];
for ( int i = 0; i < n; i++)
v[arr[i]] = i;
int maximum = int .MinValue;
int minimum = int .MaxValue;
for ( int i = 1; i <= n; i++)
{
maximum = Math.Max(maximum, v[i]);
minimum = Math.Min(minimum, v[i]);
if (maximum - minimum < i)
count = count + 1;
}
return count;
}
public static void Main(String[] args)
{
int []arr = { 4, 1, 3, 2, 5, 6 };
int n = arr.Length;
Console.Write(countOfSubarrays(arr, n) + "\n" );
}
}
|
Javascript
<script>
function countOfSubarrays(arr, n)
{
var count = 0;
var v = Array(n + 1);
for ( var i = 0; i < n; i++)
v[arr[i]] = i;
var maximum = -1000000000;
var minimum = 10000000000;
for ( var i = 1; i <= n; i++) {
maximum = Math.max(maximum, v[i]);
minimum = Math.min(minimum, v[i]);
if (maximum - minimum < i)
count = count + 1;
}
return count;
}
var arr = [4, 1, 3, 2, 5, 6 ];
var n = arr.length;
document.write( countOfSubarrays(arr, n) );
</script>
|
Time Complexity: O(N), for traversal over the array.
Auxiliary Space: O(N), for creating an extra array of size N + 1.
Last Updated :
30 Aug, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...