给定一个由N 个不同整数组成的数组A[] ,任务是重新排列给定数组,使得每个大小小于N 的相同索引非空子集的总和不等于它们在原始数组中的总和。
例子:
Input: A[] = {1000, 100, 10, 1}
Output: 100 10 1 1000
Explanation:
Original Array A[] = {1000, 100, 10, 1}
Final Array B[] = {100, 10, 1, 1000}
Subsets of size 1:
Subsets of size 2:
Subsets of size 3:
Therefore, no same-indexed subsets have equal sum.
Input: A[] = {1, 2, 3, 4, 5}
Output: 5 1 2 3 4
方法:
这个想法是简单地用一个较小的元素替换除一个之外的每个数组元素。请按照以下步骤解决问题:
- 以{A[i], i}对的形式存储数组元素。
- 按数组元素的升序对对进行排序
- 现在,遍历排序顺序,并将每个元素插入到其下一个更大元素的原始索引处(即在索引v[(i + 1) % n].second 处)。这确保除了一个索引之外的每个索引现在都有一个比存储在其中的先前值更小的元素。
Proof:
Let S = { arr1, arr2, …, arrk } be a subset.
If u does not belong to S initially, upon insertion of u into S, the sum of the subset changes.
Similarly, if u belongs to S, let S’ contains all the elements not present in S. This means that u do not belong to S’. Then, by the same reasoning above, the sum of the subset S’ differs from its original sum.
下面是上述方法的实现:
C++
A[0] = 1000 B[0] = 100
A[1] = 100 B[1] = 10
A[2] = 10 B[2] = 1
A[3] = 1 B[3] = 1000
Java
{A[0], A[1]} = 1100 {B[0], B[1]} = 110
{A[0], A[2]} = 1010 {B[0], B[2]} = 101
{A[1], A[2]} = 110 {B[1], B[2]} = 11
.....
Similarly, all same-indexed subsets of size 2 have a different sum.
Python3
{A[0], A[1], A[2]} = 1110 {B[0], B[1], B[2]} = 111
{A[0], A[2], A[3]} = 1011 {B[0], B[2], B[3]} = 1101
{A[1], A[2], A[3]} = 111 {B[1], B[2], B[3]} = 1011
C#
// C++ Program to implement
// the above approach
#include
using namespace std;
// Function to rearrange the array such
// that no same-indexed subset have sum
// equal to that in the original array
void printNewArray(vector a, int n)
{
// Initialize a vector
vector > v;
// Iterate the array
for (int i = 0; i < n; i++) {
v.push_back({ a[i], i });
}
// Sort the vector
sort(v.begin(), v.end());
int ans[n];
// Shift of elements to the
// index of its next cyclic element
for (int i = 0; i < n; i++) {
ans[v[(i + 1) % n].second]
= v[i].first;
}
// Print the answer
for (int i = 0; i < n; i++) {
cout << ans[i] << " ";
}
}
// Driver Code
int main()
{
vector a = { 4, 1, 2, 5, 3 };
int n = a.size();
printNewArray(a, n);
return 0;
}
Javascript
// Java program to implement
// the above approach
import java.io.*;
import java.util.*;
class GFG{
static class pair
{
int first, second;
pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to rearrange the array such
// that no same-indexed subset have sum
// equal to that in the original array
static void printNewArray(List a, int n)
{
// Initialize a vector
List v = new ArrayList<>();
// Iterate the array
for(int i = 0; i < n; i++)
{
v.add(new pair(a.get(i), i));
}
// Sort the vector
Collections.sort(v, (pair s1, pair s2) ->
{
return s1.first - s2.first;
});
int ans[] = new int[n];
// Shift of elements to the
// index of its next cyclic element
for(int i = 0; i < n; i++)
{
ans[v.get((i + 1) % n).second] = v.get(i).first;
}
// Print the answer
for(int i = 0; i < n; i++)
{
System.out.print(ans[i] + " ");
}
}
// Driver Code
public static void main(String args[])
{
List a = Arrays.asList(4, 1, 2, 5, 3);
int n = a.size();
printNewArray(a, n);
}
}
// This code is contributed by offbeat
# Python3 Program to implement
# the above approach
# Function to rearrange the array such
# that no same-indexed subset have sum
# equal to that in the original array
def printNewArray(a, n):
# Initialize a vector
v = []
# Iterate the array
for i in range (n):
v.append((a[i], i ))
# Sort the vector
v.sort()
ans = [0] * n
# Shift of elements to the
# index of its next cyclic element
for i in range (n):
ans[v[(i + 1) % n][1]] = v[i][0]
# Print the answer
for i in range (n):
print (ans[i], end = " ")
# Driver Code
if __name__ == "__main__":
a = [4, 1, 2, 5, 3]
n = len(a)
printNewArray(a, n)
# This code is contributed by Chitranayal
时间复杂度: O(N log N)
辅助空间: O(N)
如果您希望与专家一起参加现场课程,请参阅DSA 现场工作专业课程和学生竞争性编程现场课程。