给定一个大小为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 中。如果该元素存在,则将最左边出现的元素加 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