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

📅  最后修改于: 2021-09-05 11:46:36             🧑  作者: Mango

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

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

例子:

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

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

  • 对于数组 arr[]中的每个元素,检查该元素是否已经存在于数组B[] 中
  • 如果该元素不存在于数组B[] 中,则将该元素添加到数组B[]并将其索引添加到映射中。由于这是该元素第一次出现,因此该索引成为该元素最左侧的索引。
  • 如果该元素已存在于数组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

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live