给定一个由N个元素组成的数组,其中每个元素i,都将给出其左右元素总数的绝对差。查找实际数组元素的可能排序数。
例子:
Input : N = 5, arr[] = {2, 4, 4, 0, 2}
Output : 4
There are four possible orders, as follows:
2, 1, 4, 5, 3
2, 5, 4, 1, 3
3, 1, 4, 5, 2
3, 5, 4, 1, 2
Input : N = 7, arr[] = {6, 4, 0, 2, 4, 0, 2}
Output : 0
No any valid order is possible hence answer is 0.
方法:将问题分为两部分。当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)