Sort Array by splitting into subarrays where each element belongs to only subarray
Given an array arr[] of N distinct integers, the task is to check if it is possible to sort the array in increasing order by performing the following operations in order exactly once:
- Split the array arr[] into exactly Y(1 <= Y <= N) non-empty subarrays such that each element belongs to exactly one subarray.
- Reorder the subarrays in any arbitrary order.
- Merge the reordered subarrays.
Examples:
Input: arr[ ] = {6, 3, 4, 2, 1}, Y = 4
Output: Yes
Explanation:
The operations can be performed as:
- Split the array into exactly 4 non-empty subarrays: {6, 3, 4, 2, 1} -> {6}, {3, 4}, {2}, {1}
- Reorder the subarrays: {6}, {3, 4}, {2}, {1} -> {1}, {2}, {3, 4}, {6}
- Merging the subarrays: {1}, {2}, {3, 4}, {6} -> {1, 2, 3, 4, 6} (sorted)
Input: arr[ ] = {1, -4, 0, -2}, Y = 2
Output: No
Approach: The main idea is if the minimum number of splits required to sort the given array arr[] is less than or equal to Y, then it is always possible to sort the array. Also, the required number of splits must be equal to the count of the minimum number of splits required to divide the array into the minimum number of non-decreasing subarrays.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
pair< int , int > a[100001];
void checkForSortedSubarray( int n, int y, int arr[])
{
for ( int i = 1; i <= n; i++) {
a[i].first = arr[i];
a[i].second = i;
}
int cnt = 1;
sort(a + 1, a + n + 1);
for ( int i = 1; i <= n - 1; i++) {
if (a[i].second != a[i + 1].second - 1)
cnt++;
}
if (cnt > y)
cout << "No" ;
else
cout << "Yes" ;
}
int main()
{
int Y = 4;
int arr[] = { 6, 3, 4, 2, 1 };
int N = sizeof (arr) / sizeof (arr[0]);
checkForSortedSubarray(N, Y, arr);
return 0;
}
|
Java
import java.util.*;
class GFG{
static pair []a = new pair[ 100001 ];
static class pair
{
int first, second;
public pair( int first, int second)
{
this .first = first;
this .second = second;
}
}
static void checkForSortedSubarray( int n, int y, int arr[])
{
for ( int i = 1 ; i <= n; i++) {
a[i].first = arr[i];
a[i].second = i;
}
int cnt = 1 ;
Arrays.sort(a,(a, b) -> a.first - b.first);
for ( int i = 1 ; i <= n - 1 ; i++) {
if (a[i].second != a[i + 1 ].second - 1 )
cnt++;
}
if (cnt > y)
System.out.print( "No" );
else
System.out.print( "Yes" );
}
public static void main(String[] args)
{
int Y = 4 ;
int arr[] = { 6 , 3 , 4 , 2 , 1 };
int N = arr.length;
for ( int i = 0 ;i<a.length;i++) {
a[i] = new pair( 0 , 0 );
}
checkForSortedSubarray(N- 1 , Y, arr);
}
}
|
Python3
def checkForSortedSubarray(n, y, arr, a):
for i in range ( 0 , n, 1 ):
a[i][ 0 ] = arr[i]
a[i][ 1 ] = i
cnt = 1
a.sort()
for i in range ( 0 ,n, 1 ):
if (a[i][ 1 ] ! = a[i + 1 ][ 1 ] - 1 ):
cnt + = 1
if (cnt > y):
print ( "Yes" )
else :
print ( "No" )
if __name__ = = '__main__' :
Y = 4
a = [[ 0 , 0 ] for i in range ( 100001 )]
arr = [ 6 , 3 , 4 , 2 , 1 ]
N = len (arr)
checkForSortedSubarray(N, Y, arr,a)
|
C#
using System;
using System.Collections.Generic;
public class GFG {
static List<pair> a = new List<pair>();
public class pair {
public int first, second;
public pair( int first, int second) {
this .first = first;
this .second = second;
}
}
static void checkForSortedSubarray( int n, int y, int []arr) {
for ( int i = 1; i <= n; i++)
{
a[i].first = arr[i];
a[i].second = i;
}
int cnt = 1;
a.Sort((c, b) => c.first - b.first);
for ( int i = 1; i <= n - 1; i++) {
if (a[i].second != a[i + 1].second - 1)
cnt++;
}
if (cnt > y)
Console.Write( "No" );
else
Console.Write( "Yes" );
}
public static void Main(String[] args)
{
int Y = 4;
int []arr = { 6, 3, 4, 2, 1 };
int N = arr.Length;
for ( int i = 0; i < 100001; i++) {
a.Add( new pair(0, 0));
}
checkForSortedSubarray(N - 1, Y, arr);
}
}
|
Javascript
<script>
var a = [];
function checkForSortedSubarray(n, y, arr)
{
for (let i = 0; i < n; i++)
{
a.push({
first: arr[i],
second: i
})
}
let cnt = 1;
a.sort( function (a, b) { return a.first - b.first; })
for (let i = 0; i < n - 1; i++) {
if (a[i].second != a[i + 1].second - 1)
cnt++;
}
if (cnt > y)
document.write( "No" );
else
document.write( "Yes" );
}
let Y = 4;
let arr = [6, 3, 4, 2, 1];
let N = arr.length;
checkForSortedSubarray(N, Y, arr);
</script>
|
Time Complexity: O(N Log N)
Auxiliary Space: O(N)
Last Updated :
15 Feb, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...