Given a merged sequence which consists of two sequences which got merged, one of them was strictly increasing and the other was strictly decreasing. Elements of increasing sequence were inserted between elements of the decreasing one without changing the order.
Sequences [1, 3, 4] and [10, 4, 2] can produce the following resulting sequences:
[10, 1, 3, 4, 2, 4], [1, 3, 4, 10, 4, 2].
The following sequence cannot be the result of these insertions:
[1, 10, 4, 4, 3, 2] because the order of elements in the increasing sequence was changed.
Given a merged sequence, the task is to find any two suitable initial sequences, one of them should be strictly increasing, and another should be strictly decreasing.
Note: An empty sequence and the sequence consisting of one element can be considered as increasing or decreasing.
Examples:
Input: arr[] = {5, 1, 3, 6, 8, 2, 9, 0, 10}
Output: [1, 3, 6, 8, 9, 10] [5, 2, 0]
Input: arr[] = {1, 2, 4, 0, 2}
Output: -1
No such sequences possible.
Method 1: We can modify Longest Increasing Sequence) and solve the required problem. It will take O(nlogn) time.
Method 2: We can also solve this problem only in a single traversal. The Idea used here is that maintain two sorted arrays.
For a new element x,
- If it can be appended to only one of the arrays then append it.
- If it can be appended to neither, then the answer is -1.
- If it can be appended to both then check the next element y, if y > x then append x to the increasing one otherwise append x to the decreasing one.
Now when we encounter an element which can be included in both the sequence we need to decide based on the next element’s value. Let’s consider a situation where we need to iterate over the remaining value x,y,z where ( x < z < y) and we have already the last element of the increasing and decreasing sequence as inc and dec respectively from the visited portion of the array.
Case 1 : x<y and inc<x<dec
so we can include x in any sequence.
If we include it in decreasing sequence then dec will become x. And then for y we have only one choice i.e. to include it in increasing sequence as y>dec and inc becomes y. If we do this we cannot insert z in any sequence as z>dec and z<inc.
But if we include x to increasing sequence (inc becomes x) and y to decreasing sequence (dec becomes y) following the same logic then we can place z in any sequence and get an answer.
Case 2 : x>=y and inc<x<dec
it follows the same logic as above.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
void Find_Sequence( int arr[], int n)
{
vector< int > inc_arr, dec_arr;
int flag = 0;
long inc = -1, dec = 1e7;
for ( int i = 0; i < n; i++)
{
if (inc < arr[i] && arr[i] < dec)
{
if (arr[i] < arr[i + 1])
{
inc = arr[i];
inc_arr.emplace_back(arr[i]);
}
else
{
dec = arr[i];
dec_arr.emplace_back(arr[i]);
}
}
else if (inc < arr[i])
{
inc = arr[i];
inc_arr.emplace_back(arr[i]);
}
else if (dec > arr[i])
{
dec = arr[i];
dec_arr.emplace_back(arr[i]);
}
else
{
cout << -1 << endl;
flag = 1;
break ;
}
}
if (!flag)
{
for ( auto i = inc_arr.begin();
i != inc_arr.end(); i++)
cout << *i << " " ;
cout << endl;
for ( auto i = dec_arr.begin();
i != dec_arr.end(); i++)
cout << *i << " " ;
cout << endl;
}
}
int main()
{
int arr[] = { 5, 1, 3, 6, 8, 2, 9, 0, 10 };
int n = sizeof (arr) / sizeof (arr[0]);
Find_Sequence(arr, n);
}
|
Java
import java.util.*;
class GFG
{
static void Find_Sequence( int [] arr, int n)
{
Vector<Integer> inc_arr = new Vector<>(),
dec_arr = new Vector<>();
int flag = 0 ;
long inc = - 1 , dec = ( long ) 1e7;
for ( int i = 0 ; i < n; i++)
{
if (inc < arr[i] && arr[i] < dec)
{
if (arr[i] < arr[i + 1 ])
{
inc = arr[i];
inc_arr.add(arr[i]);
}
else
{
dec = arr[i];
dec_arr.add(arr[i]);
}
}
else if (inc < arr[i])
{
inc = arr[i];
inc_arr.add(arr[i]);
}
else if (dec > arr[i])
{
dec = arr[i];
dec_arr.add(arr[i]);
}
else
{
System.out.println(- 1 );
flag = 1 ;
break ;
}
}
if (flag == 0 )
{
for ( int i : inc_arr)
System.out.print(i + " " );
System.out.println();
for ( int i : dec_arr)
System.out.print(i + " " );
System.out.println();
}
}
public static void main(String[] args)
{
int [] arr = { 5 , 1 , 3 , 6 , 8 , 2 , 9 , 0 , 10 };
int n = arr.length;
Find_Sequence(arr, n);
}
}
|
Python3
def Find_Sequence(array, n):
inc_arr, dec_arr = [], []
inc, dec = - 1 , 1e7
for i in range (n):
if inc < array[i] < dec:
if array[i] < array[i + 1 ]:
inc = array[i]
inc_arr.append(array[i])
else :
dec = array[i]
dec_arr.append(array[i])
elif inc < array[i]:
inc = array[i]
inc_arr.append(array[i])
elif dec > array[i]:
dec = array[i]
dec_arr.append(array[i])
else :
print ( '-1' )
break
else :
print (inc_arr, dec_arr)
arr = [ 5 , 1 , 3 , 6 , 8 , 2 , 9 , 0 , 10 ]
n = len (arr)
Find_Sequence(arr, n)
|
C#
using System;
using System.Collections;
using System.Collections.Generic;
class GFG{
static void Find_Sequence( int [] arr, int n)
{
ArrayList inc_arr = new ArrayList();
ArrayList dec_arr = new ArrayList();
int flag = 0;
long inc = -1, dec = ( long )1e7;
for ( int i = 0; i < n; i++)
{
if (inc < arr[i] && arr[i] < dec)
{
if (arr[i] < arr[i + 1])
{
inc = arr[i];
inc_arr.Add(arr[i]);
}
else
{
dec = arr[i];
dec_arr.Add(arr[i]);
}
}
else if (inc < arr[i])
{
inc = arr[i];
inc_arr.Add(arr[i]);
}
else if (dec > arr[i])
{
dec = arr[i];
dec_arr.Add(arr[i]);
}
else
{
Console.Write(-1);
flag = 1;
break ;
}
}
if (flag == 0)
{
foreach ( int i in inc_arr)
Console.Write(i + " " );
Console.Write( '\n' );
foreach ( int i in dec_arr)
Console.Write(i + " " );
Console.Write( '\n' );
}
}
public static void Main( string [] args)
{
int [] arr = { 5, 1, 3, 6, 8,
2, 9, 0, 10 };
int n = arr.Length;
Find_Sequence(arr, n);
}
}
|
PHP
<?php
function Find_Sequence( $arr , $n )
{
$inc_arr = array (); $dec_arr = array ();
$inc = -1; $dec = 1e7;
for ( $i = 0; $i < $n ; $i ++)
{
if ( $inc < $arr [ $i ] && $arr [ $i ] < $dec )
{
if ( $arr [ $i ] < $arr [ $i + 1])
{
$inc = $arr [ $i ];
array_push ( $inc_arr , $arr [ $i ]);
}
else
{
$dec = $arr [ $i ];
array_push ( $dec_arr , $arr [ $i ]);
}
}
else if ( $inc < $arr [ $i ])
{
$inc = $arr [ $i ];
array_push ( $inc_arr , $arr [ $i ]);
}
else if ( $dec > $arr [ $i ])
{
$dec = $arr [ $i ];
array_push ( $dec_arr , $arr [ $i ]);
}
else
{
echo '-1' ;
break ;
}
}
print_r( $inc_arr );
print_r( $dec_arr );
}
$arr = array (5, 1, 3, 6, 8, 2, 9, 0, 10);
$n = count ( $arr );
Find_Sequence( $arr , $n );
?>
|
Javascript
<script>
function Find_Sequence(arr, n)
{
let inc_arr =[],
dec_arr = [];
let flag = 0;
let inc = -1, dec = 1e7;
for (let i = 0; i < n; i++)
{
if (inc < arr[i] && arr[i] < dec)
{
if (arr[i] < arr[i + 1])
{
inc = arr[i];
inc_arr.push(arr[i]);
}
else
{
dec = arr[i];
dec_arr.push(arr[i]);
}
}
else if (inc < arr[i])
{
inc = arr[i];
inc_arr.push(arr[i]);
}
else if (dec > arr[i])
{
dec = arr[i];
dec_arr.push(arr[i]);
}
else
{
document.write(-1);
flag = 1;
break ;
}
}
if (flag == 0)
{
document.write( "[" );
for (let i in inc_arr)
document.write( inc_arr[i] + " " );
document.write( "] " );
document.write( "[" );
for (let i in dec_arr)
document.write( dec_arr[i] + " " );
document.write( "]" );
}
}
let arr = [ 5, 1, 3, 6, 8, 2, 9, 0, 10 ];
let n = arr.length;
Find_Sequence(arr, n);
</script>
|
Output:
[1, 3, 6, 8, 9, 10] [5, 2, 0]
Time Complexity : O(n) ,where n is size of given array.
Space Complexity : O(n) ,extra space required to store strictly increasing and decreasing sequence.