使用另一个数组最大化元素的 C++ 程序
给定两个大小为 n 的数组,通过使用第二个数组中的元素来最大化第一个数组,使得形成的新数组包含两个数组的 n 个最大但唯一的元素,从而赋予第二个数组优先级(第二个数组的所有元素出现在第一个数组之前)。元素的出现顺序在输出中与输入中保持相同。
例子:
Input : arr1[] = {2, 4, 3}
arr2[] = {5, 6, 1}
Output : 5 6 4
As 5, 6 and 4 are maximum elements from two arrays giving second array higher priority. Order of elements is same in output as in input.
Input : arr1[] = {7, 4, 8, 0, 1}
arr2[] = {9, 7, 2, 3, 6}
Output : 9 7 6 4 8
方法:我们创建一个大小为 2*n 的辅助数组,并将第 2 个数组的元素存储在辅助数组中,然后我们将第 1 个数组的元素存储在其中。之后,我们将按降序对辅助数组进行排序。为了根据输入数组保持元素的顺序,我们将使用哈希表。我们将在哈希表中存储辅助数组的第 1 n 个最大唯一元素。现在我们遍历第二个数组并将第二个数组的元素存储在哈希表中存在的辅助数组中。同样,我们将遍历第一个数组并存储哈希表中存在的元素。通过这种方式,我们从辅助数组中的两个数组中获得 n 个唯一且最大的元素,同时保持元素的出现顺序相同。
以下是上述方法的实现:
C++
// C++ program to print the maximum elements
// giving second array higher priority
#include
using namespace std;
// Compare function used to sort array
// in decreasing order
bool compare(int a, int b)
{
return a > b;
}
// Function to maximize array elements
void maximizeArray(int arr1[], int arr2[],
int n)
{
// auxiliary array arr3 to store
// elements of arr1 & arr2
int arr3[2*n], k = 0;
for (int i = 0; i < n; i++)
arr3[k++] = arr1[i];
for (int i = 0; i < n; i++)
arr3[k++] = arr2[i];
// hash table to store n largest
// unique elements
unordered_set hash;
// sorting arr3 in decreasing order
sort(arr3, arr3 + 2 * n, compare);
// finding n largest unique elements
// from arr3 and storing in hash
int i = 0;
while (hash.size() != n) {
// if arr3 element not present in hash,
// then store this element in hash
if (hash.find(arr3[i]) == hash.end())
hash.insert(arr3[i]);
i++;
}
// store that elements of arr2 in arr3
// that are present in hash
k = 0;
for (int i = 0; i < n; i++) {
// if arr2 element is present in hash,
// store it in arr3
if (hash.find(arr2[i]) != hash.end()) {
arr3[k++] = arr2[i];
hash.erase(arr2[i]);
}
}
// store that elements of arr1 in arr3
// that are present in hash
for (int i = 0; i < n; i++) {
// if arr1 element is present in hash,
// store it in arr3
if (hash.find(arr1[i]) != hash.end()) {
arr3[k++] = arr1[i];
hash.erase(arr1[i]);
}
}
// copying 1st n elements of arr3 to arr1
for (int i = 0; i < n; i++)
arr1[i] = arr3[i];
}
// Function to print array elements
void printArray(int arr[], int n)
{
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << endl;
}
// Driver Code
int main()
{
int array1[] = { 7, 4, 8, 0, 1 };
int array2[] = { 9, 7, 2, 3, 6 };
int size = sizeof(array1) / sizeof(array1[0]);
maximizeArray(array1, array2, size);
printArray(array1, size);
}
9 7 6 4 8
时间复杂度:O(n * log n)。
有关更多详细信息,请参阅有关使用另一个数组最大化元素的完整文章!