Skip to content

【计数】出现次数最多的前两个元素

使数组变成交替数组的最少操作数

给你一个下标从 0 开始的数组 nums ,该数组由 n 个正整数组成。

如果满足下述条件,则数组 nums 是一个 交替数组 :

nums[i - 2] == nums[i] ,其中 2 <= i <= n - 1 。 nums[i - 1] != nums[i] ,其中 1 <= i <= n - 1 。 在一步 操作 中,你可以选择下标 i 并将 nums[i] 更改 为 任一 正整数。

返回使数组变成交替数组的 最少操作数 。

核心在于手写计数统计,找到数量最多的前两个元素。

在c++合适的做法就是需要先map计数再存入vector>根据数量排序(map本身是根据key排序的,所以没法直接用),非常繁琐...

class Solution {
public:
    int minimumOperations(vector<int>& nums) {
        int n = nums.size();
        unordered_map<int, int> mp0, mp1;
        for (int i = 0; i < n; i++) {
            if (i % 2 == 0) mp0[nums[i]]++;
            else mp1[nums[i]]++;
        }
        vector<pair<int, int>> v0, v1;
        for (auto &[num, cnt] : mp0) v0.emplace_back(cnt, num);
        for (auto &[num, cnt] : mp1) v1.emplace_back(cnt, num);

        v0.emplace_back(0, 0); /* 存入[0,0]保证数组最少有两个元素 */
        v1.emplace_back(0, 0);

        sort(v0.begin(), v0.end(), greater<pair<int, int>>());
        sort(v1.begin(), v1.end(), greater<pair<int, int>>());

        /* 判断最大次数的数值是否相等, 如果不相等, 取两个最大值相加; 否则取最大和次大相加 */
        if (v0[0].second != v1[0].second) return n - v0[0].first - v1[0].first;
        return n - max(v0[0].first + v1[1].first, v0[1].first + v1[0].first);
    }
};