从数组 q 中找到排列 p 使得 q[i] = p[i+1] – p[i]
给定一个长度为N的数组Q[] ,任务是从[1, N + 1]范围内找到整数的排列P[]使得Q[i] = P[i + 1] – P[i]对于所有有效的i 。如果不可能,则打印-1 。
例子:
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
方法:
让,
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].
相似地,
P[n] = x + Q[0] + Q[1] + Q[2 ] + ….. + Q[N – 1].
这意味着序列p' = 0, Q[1], Q[1] + Q[2], ....., + Q[1] + Q[2] + Q[3] + ..... + Q如果我们将x添加到每个元素,则[N – 1]是所需的排列。
要找到x的值,请找到一个使p'[i]最小的 i。
因为, p'[i] + x是系列中的最小值,所以它必须等于1 ,因为系列可以具有[1, N]中的值。
所以x = 1 – p'[i] 。
下面是上述方法的实现:
C++
// C++ implementation of the approach
#include
using namespace std;
// Function to return the minimum
// value of x from the given array q
int Get_Minimum(vector 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;
}
// Function to return the required permutation
vector Find_Permutation(vector q, int n)
{
vector p(n, 0);
int min_value = Get_Minimum(q);
// Set the value of p[0] i.e. x = p[0]
p[0] = 1 - min_value;
// Iterate over array q[]
for (int i = 0; i < n - 1; i++)
p[i + 1] = p[i] + q[i];
bool okay = true;
// Check if formed permutation
// is correct or not
for (int i = 0; i < n; i++)
{
if (p[i] < 1 or p[i] > n)
okay = false;
set w(p.begin(), p.end());
if (w.size() != n)
okay = false;
}
// Return the permutation p
if (okay)
return p;
else
return {-1};
}
// Driver code
int main()
{
vector q = {-2, 1};
int n = q.size() + 1;
cout << "[ ";
for (int i:Find_Permutation(q, n))
cout << i << " ";
cout << "]";
}
// This code is contributed by Mohit Kumar
Java
// Java implementation of the approach
import java.util.*;
class GFG
{
// Function to return the minimum
// value of x from the given array q
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;
}
// Function to return the required permutation
static int [] Find_Permutation(int [] q, int n)
{
int [] p = new int[n];
int min_value = Get_Minimum(q);
// Set the value of p[0] i.e. x = p[0]
p[0] = 1 - min_value;
// Iterate over array q[]
for (int i = 0; i < n - 1; i++)
p[i + 1] = p[i] + q[i];
boolean okay = true;
// Check if formed permutation
// is correct or not
for (int i = 0; i < n; i++)
{
if (p[i] < 1 || p[i] > n)
okay = false;
Set w = new HashSet<>();
if (w.size() != n)
okay = true;
}
// Return the permutation p
if (okay)
return p;
else
return new int []{-1};
}
// Driver code
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("]");
}
}
// This code is contributed by 29AjayKumar
Python3
# Python3 implementation of the approach
# Function to return the minimum
# value of x from the given array q
def Get_Minimum(q):
minimum = 0
sum = 0
for i in range(n - 1):
sum += q[i]
if sum < minimum:
minimum = sum
return minimum
# Function to return the
# required permutation
def Find_Permutation(q):
p = [0] * n
min_value = Get_Minimum(q)
# Set the value of p[0]
# i.e. x = p[0]
p[0]= 1 - min_value
# Iterate over array q[]
for i in range(n - 1):
p[i + 1] = p[i] + q[i]
okay = True
# Check if formed permutation
# is correct or not
for i in range(n):
if p[i] < 1 or p[i] > n:
okay = False
if len(set(p)) != n:
okay = False
# Return the permutation p
if okay:
return p
else:
return -1
# Driver code
if __name__=="__main__":
q = [-2, 1]
n = len(q) + 1
print(Find_Permutation(q))
C#
// C# implementation of the approach
using System;
using System.Collections.Generic;
class GFG
{
// Function to return the minimum
// value of x from the given array q
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;
}
// Function to return the required permutation
static int [] Find_Permutation(int [] q, int n)
{
int [] p = new int[n];
int min_value = Get_Minimum(q);
// Set the value of p[0] i.e. x = p[0]
p[0] = 1 - min_value;
// Iterate over array q[]
for (int i = 0; i < n - 1; i++)
p[i + 1] = p[i] + q[i];
bool okay = true;
// Check if formed permutation
// is correct or not
for (int i = 0; i < n; i++)
{
if (p[i] < 1 || p[i] > n)
okay = false;
HashSet w = new HashSet();
if (w.Count != n)
okay = true;
}
// Return the permutation p
if (okay)
return p;
else
return new int []{-1};
}
// Driver code
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("]");
}
}
// This code is contributed by PrinciRaj1992
Javascript
[3, 1, 2]