📌  相关文章
📜  使用给定数组中的给定条件生成一个数组

📅  最后修改于: 2021-04-27 09:16:12             🧑  作者: Mango

给定大小为N的数组arr [] ,任务是使用数组A的元素构造一个新的数组B [] ,使得:

  1. 如果B []中不存在该元素,则将其附加到末尾。
  2. 如果B []中存在该元素,则首先将其最左边出现的位置加1,然后将此元素附加到数组的末尾。

例子:

天真的方法:对于数组A中的每个元素,检查它是否存在于数组B中。如果该元素存在,则将最左边的出现增加一。最后,在数组B []的末尾添加元素。
时间复杂度: O(N 2 )

高效方法:想法是使用地图存储每个元素的所有索引。数组B []生成为:

  • 对于数组arr []中的每个元素,检查该元素是否已存在于数组B []中
  • 如果数组B []中不存在该元素,则将该元素添加到数组B []中,并将其索引添加到map中。由于这是元素的第一次出现,因此该索引成为元素的最左侧索引
  • 如果元素已经存在于数组B []中,则返回最左边的索引,并将该索引处的元素1。当值增加时,旧值的最左面的索引与新值的索引一起被更新。

下面是上述方法的实现:

// C++ program to generate an array
// from a given array under the
// given conditions
  
#include 
using namespace std;
  
// Function to generate an array
// from a given array under the
// given conditions
void newArray(int A[], int n)
{
    // To maintain indexes of the
    // elements in sorted order
    unordered_map > idx;
  
    // Initialize new array B
    std::vector B;
  
    // For every element in the given
    // array arr[]
    for (int i = 0; i < n; ++i) {
  
        // Check if the element is present
        // in the array B[]
        if (idx.find(A[i]) != idx.end()) {
  
            // Get the leftmost position
            // in the array B
            int pos = *idx[A[i]].begin();
  
            // Remove the leftmost position
            idx[A[i]].erase(idx[A[i]].begin());
  
            // Increment the value at
            // the leftmost position
            B[pos]++;
  
            // Insert new value position
            // in the map
            idx[B[pos]].insert(pos);
        }
  
        // Append arr[i] at the end
        // of the array B
        B.push_back(A[i]);
  
        // Insert its position in hash-map
        idx[A[i]].insert(i);
    }
  
    // Print the generated array
    for (int i = 0; i < n; ++i)
        cout << B[i] << " ";
}
  
// Driver code
int main()
{
    int arr[] = { 1, 2, 1, 2 };
    int n = sizeof(arr) / sizeof(int);
  
    newArray(arr, n);
  
    return 0;
}
输出:
3 2 1 2