给定大小为N的数组arr [] ,任务是使用数组A的元素构造一个新的数组B [] ,使得:
- 如果B []中不存在该元素,则将其附加到末尾。
- 如果B []中存在该元素,则首先将其最左边出现的位置加1,然后将此元素附加到数组的末尾。
例子:
Input: arr[] = {1, 2, 1, 2}
Output: { 3, 2, 1, 2 }
Explanation:
arr[0] = 1, B = {}. 1 is not present in B. So append it at the end. Therefore, B = {1}
arr[1] = 2, B = {1}. 2 is not present in B. So append it at the end. Therefore, B[] = {1, 2}
arr[2] = 1, B = {1, 2}. 1 is already present in B[]. So increment B[0] by 1 and append 1 at the end. Therefore B[] = {2, 2, 1}
arr[3] = 2, B = {2, 2, 1}. 2 is already present in B[]. So increment B[0] by 1 and append 2 at the end. Therefore B[] = {3, 2, 1, 2}
Input: arr[] = {2, 5, 4, 2, 8, 4, 2}
Output: {3, 5, 5, 3, 8, 4, 2}
天真的方法:对于数组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