📜  当给出左右元素数量之间的绝对差时的可能排列数量

📅  最后修改于: 2021-04-26 06:09:50             🧑  作者: Mango

给定一个由N个元素组成的数组,其中每个元素i,都将给出其左右元素总数的绝对差。查找实际数组元素的可能排序数。

例子:

方法:将问题分为两部分。当N为奇数且N为偶数时。

  • 情况1:当N为奇数时。
    考虑N = 7,有7个空白,左右元素之间的绝对差必须类似于[6 4 2 0 2 4 6]。观察到位于中间的元素的绝对差必须为0,而其他元素的绝对差为2至N-1,并且每个元素的计数应为2。如果不满足,则每个元素都没有有效的顺序从2到N-1的元素i,我们有2种方法来填充空间,因此总方法将是所有方法的乘积。
  • 情况2:当N为偶数时。
    考虑N = 6,有6个空格,类似于[5 3 1 1 3 5],其中a [i]给出左右元素数目之间的绝对差。对于每个a [i],我们有2种方法,因此答案将是所有方法的乘积。

下面是该方法的实现:

C++
// C++ implementation of the above approach
#include 
using namespace std;
  
// Function to find the number of permutations 
// possible of the original array to satisfy 
// the given absolute differences
int totalways(int* arr, int n)
{
    // To store the count of each
    // a[i] in a map
    unordered_map cnt;
    for (int i = 0; i < n; ++i) {
        cnt[arr[i]]++;
    }
  
    // if n is odd
    if (n % 2 == 1) {
        int start = 0, endd = n - 1;
  
        // check the count of each whether
        // it satisfy the given criteria or not
        for (int i = start; i <= endd; i = i + 2) {
            if (i == 0) {
  
                // there is only 1 way
                // for middle element.
                if (cnt[i] != 1) {
                    return 0;
                }
            }
            else {
  
                // for others there are 2 ways.
                if (cnt[i] != 2) {
                    return 0;
                }
            }
        }
  
        // now find total ways
        int ways = 1;
        start = 2, endd = n - 1;
        for (int i = start; i <= endd; i = i + 2) {
            ways = ways * 2;
        }
        return ways;
    }
  
    // When n is even.
    else if (n % 2 == 0) {
  
        // there will be no middle element so
        // for each a[i] there will be 2 ways
        int start = 1, endd = n - 1;
        for (int i = 1; i <= endd; i = i + 2) {
            if (cnt[i] != 2)
                return 0;
        }
        int ways = 1;
        for (int i = start; i <= endd; i = i + 2) {
            ways = ways * 2;
        }
        return ways;
    }
}
  
// Driver Code
int main()
{
    int N = 5;
  
    int arr[N] = { 2, 4, 4, 0, 2 };
  
    cout<


Java
// Java implementation of the above approach
import java.util.*;
  
class GFG 
{
  
// Function to find the number of permutations 
// possible of the original array to satisfy 
// the given absolute differences
static int totalways(int[] arr, int n)
{
    // To store the count of each
    // a[i] in a map
    HashMapcnt = new HashMap();
  
    for (int i = 0 ; i < n; i++)
    {
        if(cnt.containsKey(arr[i]))
        {
            cnt.put(arr[i], cnt.get(arr[i])+1);
        }
        else
        {
            cnt.put(arr[i], 1);
        }
    }
      
    // if n is odd
    if (n % 2 == 1)
    {
        int start = 0, endd = n - 1;
  
        // check the count of each whether
        // it satisfy the given criteria or not
        for (int i = start; i <= endd; i = i + 2) 
        {
            if (i == 0) 
            {
  
                // there is only 1 way
                // for middle element.
                if (cnt.get(i) != 1)
                {
                    return 0;
                }
            }
            else 
            {
  
                // for others there are 2 ways.
                if (cnt.get(i) != 2) 
                {
                    return 0;
                }
            }
        }
  
        // now find total ways
        int ways = 1;
        start = 2; endd = n - 1;
        for (int i = start; i <= endd; i = i + 2) 
        {
            ways = ways * 2;
        }
        return ways;
    }
  
    // When n is even.
    else if (n % 2 == 0) 
    {
  
        // there will be no middle element so
        // for each a[i] there will be 2 ways
        int start = 1, endd = n - 1;
        for (int i = 1; i <= endd; i = i + 2) 
        {
            if (cnt.get(i) != 2)
                return 0;
        }
        int ways = 1;
        for (int i = start; i <= endd; i = i + 2) 
        {
            ways = ways * 2;
        }
        return ways;
    }
    return Integer.MIN_VALUE;
}
  
// Driver Code
public static void main(String[] args) 
{
    int N = 5;
  
    int []arr = { 2, 4, 4, 0, 2 };
  
    System.out.println(totalways(arr, N));
}
}
  
// This code is contributed by Princi Singh


Python3
# Python3 implementation of the above approach
  
# Function to find the number of permutations
# possible of the original array to satisfy
# the given absolute differences
def totalways(arr, n):
      
    # To store the count of each
    # a[i] in a map
    cnt = dict()
    for i in range(n):
        cnt[arr[i]] = cnt.get(arr[i], 0) + 1
  
    # if n is odd
    if (n % 2 == 1):
        start, endd = 0, n - 1
  
        # check the count of each whether
        # it satisfy the given criteria or not
        for i in range(start, endd + 1, 2):
            if (i == 0):
  
                # there is only 1 way
                # for middle element.
                if (cnt[i] != 1):
                    return 0
            else:
  
                # for others there are 2 ways.
                if (cnt[i] != 2):
                    return 0
  
        # now find total ways
        ways = 1
        start = 2
        endd = n - 1
        for i in range(start, endd + 1, 2):
            ways = ways * 2
        return ways
  
    # When n is even.
    elif (n % 2 == 0):
  
        # there will be no middle element so
        # for each a[i] there will be 2 ways
        start = 1
        endd = n - 1
        for i in range(1, endd + 1, 2):
            if (cnt[i] != 2):
                return 0
        ways = 1
        for i in range(start, endd + 1, 2):
            ways = ways * 2
        return ways
  
# Driver Code
N = 5
  
arr = [2, 4, 4, 0, 2 ]
  
print(totalways(arr, N))
  
# This code is contributed by Mohit Kumar


C#
// C# implementation of the above approach
using System;
using System.Collections.Generic;
  
class GFG 
{
  
// Function to find the number of permutations 
// possible of the original array to satisfy 
// the given absolute differences
static int totalways(int[] arr, int n)
{
    // To store the count of each
    // a[i] in a map
    Dictionary cnt = new Dictionary();
  
    for (int i = 0 ; i < n; i++)
    {
        if(cnt.ContainsKey(arr[i]))
        {
            cnt[arr[i]] = cnt[arr[i]] + 1;
        }
        else
        {
            cnt.Add(arr[i], 1);
        }
    }
      
    // if n is odd
    if (n % 2 == 1)
    {
        int start = 0, endd = n - 1;
  
        // check the count of each whether
        // it satisfy the given criteria or not
        for (int i = start; i <= endd; i = i + 2) 
        {
            if (i == 0) 
            {
  
                // there is only 1 way
                // for middle element.
                if (cnt[i] != 1)
                {
                    return 0;
                }
            }
            else
            {
  
                // for others there are 2 ways.
                if (cnt[i] != 2) 
                {
                    return 0;
                }
            }
        }
  
        // now find total ways
        int ways = 1;
        start = 2; endd = n - 1;
        for (int i = start; i <= endd; i = i + 2) 
        {
            ways = ways * 2;
        }
        return ways;
    }
  
    // When n is even.
    else if (n % 2 == 0) 
    {
  
        // there will be no middle element so
        // for each a[i] there will be 2 ways
        int start = 1, endd = n - 1;
        for (int i = 1; i <= endd; i = i + 2) 
        {
            if (cnt[i] != 2)
                return 0;
        }
          
        int ways = 1;
        for (int i = start; i <= endd; i = i + 2) 
        {
            ways = ways * 2;
        }
        return ways;
    }
    return int.MinValue;
}
  
// Driver Code
public static void Main(String[] args) 
{
    int N = 5;
  
    int []arr = { 2, 4, 4, 0, 2 };
  
    Console.WriteLine(totalways(arr, N));
}
}
  
// This code is contributed by 29AjayKumar


输出:
4

时间复杂度: O(N)