📌  相关文章
📜  重新排列数组,使得相同索引子集的总和不同于它们在原始数组中的总和

📅  最后修改于: 2021-10-25 11:23:03             🧑  作者: Mango

给定一个由N 个不同整数组成的数组A[] ,任务是重新排列给定数组,使得每个大小小于N 的相同索引非空子集的总和不等于它们在原始数组中的总和。
例子:

方法:
这个想法是简单地用一个较小的元素替换除一个之外的每个数组元素。请按照以下步骤解决问题:

  • {A[i], i}对的形式存储数组元素。
  • 按数组元素的升序对对进行排序
  • 现在,遍历排序顺序,并将每个元素插入到其下一个更大元素的原始索引处(即在索引v[(i + 1) % n].second 处)。这确保除了一个索引之外的每个索引现在都有一个比存储在其中的先前值更小的元素。

下面是上述方法的实现:

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 现场工作专业课程学生竞争性编程现场课程