📜  从数组 q 中找到排列 p 使得 q[i] = p[i+1] – p[i]

📅  最后修改于: 2022-05-13 01:57:50.374000             🧑  作者: Mango

从数组 q 中找到排列 p 使得 q[i] = p[i+1] – p[i]

给定一个长度为N的数组Q[] ,任务是从[1, N + 1]范围内找到整数的排列P[]使得Q[i] = P[i + 1] – P[i]对于所有有效的i 。如果不可能,则打印-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]