给定两个排序的数组A []和B [],它们由N个不同的整数组成,任务是重新排列数组B []的元素,以使得对于每个第i个索引, A [i]不等于B [i] 。如果存在多个这样的安排,请打印其中的任何一种。如果不存在这样的安排,则打印-1 。
例子:
Input: A[] = {2, 4, 5, 8}, B[] = {2, 4, 5, 8}
Output: 4 2 8 5
Explanation:
Possible arrangements that satisfy the required conditions are {4, 2, 8, 5}, {8, 5, 4, 2} and {8, 5, 4, 2}.
Input: A[] = {1, 3, 4, 5}, B[] = {2, 4, 6, 7}
Output: 7 6 2 4
天真的方法:最简单的方法是找到数组B []的所有可能排列,并打印其中的任何排列,这样,对于每个第i个索引, A [i])不等于B [i] 。
时间复杂度: O(N * N!)
辅助空间: O(N)
高效方法:为了优化上述方法,我们的想法是使用贪婪方法,通过使用两个数组都由N个不同元素组成的条件来查找数组B []的所需排列。请按照以下步骤解决问题:
- 反转给定数组B [] 。
- 如果N为1且A [0] = B [0] ,则打印-1 。
- 否则,遍历数组,并检查A [i]是否等于B [i] 。
- 如果A [i]等于B [i] ,则用B [i + 1]交换B [i ]并中断循环。
- 完成上述步骤后,打印数组B [] 。
下面是上述方法的实现:
C++14
// C++ program for the above approach
#include
using namespace std;
// Function to find the arrangement
// of array B[] such that element at
// each index of A[] and B[] are not equal
void RearrangeB(int A[], vector B, int n)
{
// Print not possible, if arrays
// only have single equal element
if (n == 1 && A[0] == B[0])
{
cout << "-1" << endl;
return;
}
// Reverse array B
for(int i = 0; i < n / 2; i++)
{
int t = B[i];
B[i] = B[n - i - 1];
B[n - i - 1] = t;
}
// Traverse over arrays to check
// if there is any index where
// A[i] and B[i] are equal
for(int i = 0; i < n - 1; i++)
{
// Swap B[i] with B[i - 1]
if (B[i] == A[i])
{
int t = B[i + 1];
B[i + 1] = B[i];
B[i] = t;
// Break the loop
break;
}
}
// Print required arrangement
// of array B
for(int k : B)
cout << k << " ";
}
// Driver Code
int main()
{
// Given arrays A[] and B[]
int A[] = { 2, 4, 5, 8 };
vector B = { 2, 4, 5, 8 };
// Length of array A[]
int n = sizeof(A) / sizeof(A[0]);
// Function call
RearrangeB(A, B, n);
}
// This code is contributed by sanjoy_62
Java
// Java program for the above approach
import java.util.*;
import java.lang.*;
class GFG {
// Function to find the arrangement
// of array B[] such that element at
// each index of A[] and B[] are not equal
static void RearrangeB(int[] A, int[] B)
{
// Length of array
int n = A.length;
// Print not possible, if arrays
// only have single equal element
if (n == 1 && A[0] == B[0]) {
System.out.println("-1");
return;
}
// Reverse array B
for (int i = 0; i < n / 2; i++) {
int t = B[i];
B[i] = B[n - i - 1];
B[n - i - 1] = t;
}
// Traverse over arrays to check
// if there is any index where
// A[i] and B[i] are equal
for (int i = 0; i < n - 1; i++) {
// Swap B[i] with B[i - 1]
if (B[i] == A[i]) {
int t = B[i + 1];
B[i + 1] = B[i];
B[i] = t;
// Break the loop
break;
}
}
// Print required arrangement
// of array B
for (int k : B)
System.out.print(k + " ");
}
// Driver Code
public static void main(String[] args)
{
// Given arrays A[] and B[]
int[] A = { 2, 4, 5, 8 };
int[] B = { 2, 4, 5, 8 };
// Function Call
RearrangeB(A, B);
}
}
Python3
# Python3 program for the above approach
# Function to find the arrangement
# of array B[] such that element at
# each index of A[] and B[] are not equal
def RearrangeB(A, B):
# Length of array
n = len(A)
# Print not possible, if arrays
# only have single equal element
if (n == 1 and A[0] == B[0]):
print(-1)
return
# Reverse array B
for i in range(n // 2):
t = B[i]
B[i] = B[n - i - 1]
B[n - i - 1] = t
# Traverse over arrays to check
# if there is any index where
# A[i] and B[i] are equal
for i in range(n - 1):
# Swap B[i] with B[i - 1]
if (B[i] == A[i]):
B[i], B[i - 1] = B[i - 1], B[i]
break
# Print required arrangement
# of array B
for k in B:
print(k, end = " ")
# Driver Code
# Given arrays A[] and B[]
A = [ 2, 4, 5, 8 ]
B = [ 2, 4, 5, 8 ]
# Function call
RearrangeB(A, B)
# This code is contributed by Shivam Singh
C#
// C# program for
// the above approach
using System;
class GFG{
// Function to find the arrangement
// of array []B such that element at
// each index of []A and []B
// are not equal
static void RearrangeB(int[] A,
int[] B)
{
// Length of array
int n = A.Length;
// Print not possible, if arrays
// only have single equal element
if (n == 1 && A[0] == B[0])
{
Console.WriteLine("-1");
return;
}
// Reverse array B
for (int i = 0; i < n / 2; i++)
{
int t = B[i];
B[i] = B[n - i - 1];
B[n - i - 1] = t;
}
// Traverse over arrays to check
// if there is any index where
// A[i] and B[i] are equal
for (int i = 0; i < n - 1; i++)
{
// Swap B[i] with B[i - 1]
if (B[i] == A[i])
{
int t = B[i + 1];
B[i + 1] = B[i];
B[i] = t;
// Break the loop
break;
}
}
// Print required arrangement
// of array B
foreach (int k in B)
Console.Write(k + " ");
}
// Driver Code
public static void Main(String[] args)
{
// Given arrays []A and []B
int[] A = {2, 4, 5, 8};
int[] B = {2, 4, 5, 8};
// Function Call
RearrangeB(A, B);
}
}
// This code is contributed by 29AjayKumar
输出:
8 5 4 2
时间复杂度: O(N)
辅助空间: O(1)