反复去除三联体的最大和最小元素后可能剩下的最长的独立元素阵列

117 阅读2分钟

反复去除三联体的最大和最小元素后可能剩下的最长的独立元素阵列

  • 最后更新 : 2021年8月6日

给定一个由N个整数组成的数组 arr[],任务是重复选择三联体,并在每次操作中去除三联体中的最大和最小元素,使剩余的数组具有最长的可能长度,并且只由不同的元素组成。

例子。

输入。 N = 5, arr[] = {1, 2, 1, 3, 7}<输出。 3
**解释。**选择三联体(1,2,1),去掉1和2。剩下的数组是[1, 3, 7],其中所有元素都是成对的。

**输入。**N = 6, arr[] = {8, 8, 8, 9, 9, 9}
**输出。**2

**办法。**按照下面的步骤来解决这个问题。

  • 遍历数组 arr[],计算每个数组元素的频率。

  • 对于每个不同的元素,检查其频率是偶数还是奇数,并相应地执行以下操作。

    • 如果频率是奇数(除1)。
      • 在每次操作中删除2个元素,通过选择相同元素的三联体。经过一系列的操作后,将只剩下1个元素的出现。
    • 如果频率是偶数(除了2)。
      • 在每个操作中删除2个元素,通过在三联体中选择相同的值。经过一系列的操作后,将只剩下两个元素的出现。
      • 现在,初始化一个变量,如cnt,以存储所有偶数频繁的数组元素的数量。
      • 如果cnt是偶数,则使所有偶数元素成为唯一的,而不从数组中删除任何唯一元素,只从偶数频繁元素中选择三联体。
      • 否则,删除1个独特的元素,使数组成对地不同。

    下面是上述方法的实现。

    C++

    // C++ Program to implement
    // the above approach
    #include <bits/stdc++.h>
    using namespace std;
    // Function to return length of longest
    // remaining array of pairwise distinct
    // array possible by removing triplets
    int maxUniqueElements(int A[],int N)
    {
    // Stores the frequency of array elements
    unordered_map<int,int> mp;
    // Traverse the array
    for (int i = 0; i < N; i++) {
    mp[A[i]]++;
    }
    // Iterate through the map
    int cnt = 0;
    for (auto x : mp) {
    // If frequency of current
    // element is even
    if (x.second % 2 == 0) {
    cnt++;
    }
    }
    // Stores the required count
    // of unique elements remaining
    int ans = mp.size();
    // If count is odd
    if (cnt % 2 == 1) {
    ans--;
    }
    return ans;
    }
    // Driver Code
    int main()
    {
    int N = 5;
    int A[] = { 1, 2, 1, 3, 7 };
    cout << maxUniqueElements(A, N);
    }

    输出。

    3
    
    

    时间复杂度。O(N)
    辅助空间。O(N)

    读者请注意!现在不要停止学习。以学生可接受的价格获得所有重要的DSA概念。 DSA自学课程以适合学生的价格掌握所有重要的DSA概念,并为行业做好准备。 要完成从学习语言到DS Algo以及更多的准备工作,请参考 完整的面试准备课程.

    如果你想参加专家的现场课程 ,请参考 针对在职专业人士的DSA现场课程面向学生的竞争性编程直播.

    我的个人笔记 arrow_drop_up

    保存