Find the permutation p from the array q such that q[i] = p[i+1] – p[i]
Last Updated :
09 Jun, 2022
Given an array Q[] of length N, the task is to find the permutation P[] of integers from the range [1, N + 1] such that Q[i] = P[i + 1] – P[i] for all valid i. If it is not possible then print -1.
Examples:
Input: Q[] = {-2, 1}
Output: 3 1 2
q[0] = p[1] – p[0] = 1 – 3 = -2
q[1] = p[2] – p[1] = 2 – 1 = 1
Input: Q[] = {1, 1, 1, 1}
Output: 1 2 3 4 5
Input: Q[] = {-1, 2, 2}
Output: -1
Approach:
Let,
P[0] = x then P[1] = P[0] + (P[1] – P[0]) = x + Q[0]
and, P[2] = P[0] + (P[1] – P[0]) + (P[2] – P[1]) = x + Q[0] + Q[1].
Similarly,
P[n] = x + Q[0] + Q[1] + Q[2 ] + ….. + Q[N – 1].
It means that the sequence p’ = 0, Q[1], Q[1] + Q[2], ….., + Q[1] + Q[2] + Q[3] + ….. + Q[N – 1] is the required permutation if we add x to each element.
To find the value of x, find an i such that p'[i] is minimum.
As, p'[i] + x is the minimum value in the series then it must be equal to 1 as series can have values from [1, N].
So x = 1 – p'[i].
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
int Get_Minimum(vector< int > q)
{
int minimum = 0;
int sum = 0;
for ( int i = 0; i < q.size() - 1; i++)
{
sum += q[i];
if (sum < minimum)
minimum = sum;
}
return minimum;
}
vector< int > Find_Permutation(vector< int > q, int n)
{
vector< int > p(n, 0);
int min_value = Get_Minimum(q);
p[0] = 1 - min_value;
for ( int i = 0; i < n - 1; i++)
p[i + 1] = p[i] + q[i];
bool okay = true ;
for ( int i = 0; i < n; i++)
{
if (p[i] < 1 or p[i] > n)
okay = false ;
set< int > w(p.begin(), p.end());
if (w.size() != n)
okay = false ;
}
if (okay)
return p;
else
return {-1};
}
int main()
{
vector< int > q = {-2, 1};
int n = q.size() + 1;
cout << "[ " ;
for ( int i:Find_Permutation(q, n))
cout << i << " " ;
cout << "]" ;
}
|
Java
import java.util.*;
class GFG
{
static int Get_Minimum( int [] q)
{
int minimum = 0 ;
int sum = 0 ;
for ( int i = 0 ; i < q.length - 1 ; i++)
{
sum += q[i];
if (sum < minimum)
minimum = sum;
}
return minimum;
}
static int [] Find_Permutation( int [] q, int n)
{
int [] p = new int [n];
int min_value = Get_Minimum(q);
p[ 0 ] = 1 - min_value;
for ( int i = 0 ; i < n - 1 ; i++)
p[i + 1 ] = p[i] + q[i];
boolean okay = true ;
for ( int i = 0 ; i < n; i++)
{
if (p[i] < 1 || p[i] > n)
okay = false ;
Set<Integer> w = new HashSet<>();
if (w.size() != n)
okay = true ;
}
if (okay)
return p;
else
return new int []{- 1 };
}
public static void main(String args[])
{
int []q = {- 2 , 1 };
int n = q.length + 1 ;
System.out.print( "[ " );
for ( int i:Find_Permutation(q, n))
System.out.print(i + " " );
System.out.print( "]" );
}
}
|
Python3
def Get_Minimum(q):
minimum = 0
sum = 0
for i in range (n - 1 ):
sum + = q[i]
if sum < minimum:
minimum = sum
return minimum
def Find_Permutation(q):
p = [ 0 ] * n
min_value = Get_Minimum(q)
p[ 0 ] = 1 - min_value
for i in range (n - 1 ):
p[i + 1 ] = p[i] + q[i]
okay = True
for i in range (n):
if p[i] < 1 or p[i] > n:
okay = False
if len ( set (p)) ! = n:
okay = False
if okay:
return p
else :
return - 1
if __name__ = = "__main__" :
q = [ - 2 , 1 ]
n = len (q) + 1
print (Find_Permutation(q))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int Get_Minimum( int [] q)
{
int minimum = 0;
int sum = 0;
for ( int i = 0; i < q.Length - 1; i++)
{
sum += q[i];
if (sum < minimum)
minimum = sum;
}
return minimum;
}
static int [] Find_Permutation( int [] q, int n)
{
int [] p = new int [n];
int min_value = Get_Minimum(q);
p[0] = 1 - min_value;
for ( int i = 0; i < n - 1; i++)
p[i + 1] = p[i] + q[i];
bool okay = true ;
for ( int i = 0; i < n; i++)
{
if (p[i] < 1 || p[i] > n)
okay = false ;
HashSet< int > w = new HashSet< int >();
if (w.Count != n)
okay = true ;
}
if (okay)
return p;
else
return new int []{-1};
}
public static void Main(String []args)
{
int []q = {-2, 1};
int n = q.Length + 1;
Console.Write( "[ " );
foreach ( int i in Find_Permutation(q, n))
Console.Write(i + " " );
Console.Write( "]" );
}
}
|
Javascript
<script>
function Get_Minimum(q)
{
let minimum = 0;
let sum = 0;
for (let i = 0; i < q.length - 1; i++)
{
sum += q[i];
if (sum < minimum)
minimum = sum;
}
return minimum;
}
function Find_Permutation(q, n)
{
let p = new Array(n);
let min_value = Get_Minimum(q);
p[0] = 1 - min_value;
for (let i = 0; i < n - 1; i++)
p[i + 1] = p[i] + q[i];
let okay = true ;
for (let i = 0; i < n; i++)
{
if (p[i] < 1 || p[i] > n)
okay = false ;
let w = new Set();
if (w.size != n)
okay = true ;
}
if (okay)
return p;
else
return new [-1];
}
let q = [ -2, 1 ];
let n = q.length + 1;
document.write( "[ " );
let temp = Find_Permutation(q, n);
for (let i = 0; i < temp.length; i++)
document.write(temp[i] + " " );
document.write( "]" );
</script>
|
Time Complexity: O(n2)
Auxiliary Space: O(n)
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...