LeetCode 2170

解题思路
       根据题意,求出最少的操作数,即分别在奇数位和偶数位上求出出现最多的数,统计这两个数的出现次数,所求即为总长度减去这两个数的出现次数(即将其他数修改为这两个数)。
       又因为题目不允许所有数都相同,所以应在出现最多次的数相同时判断次多出现的数,即所求为总长度减去(奇数位出现最多的数的次数+偶数位出现次多的数的次数)与(奇数位出现次多的数的次数+偶数位出现最多的数的次数)两者中较小的一个。
       具体实现与思路已经在代码中注释。

class Solution {
public:
    //两个哈希表,分别存放奇数位的数据和偶数位的数据
    unordered_map <int,int> m1;
    unordered_map <int,int> m2;
    int minimumOperations(vector<int>& nums) {
        int n=nums.size();
        //奇偶数位上出现次数最多的数的次数
        int M1=0,M2=0;
        //奇偶数位上出现次数第二多的数的次数
        int M1M=0,M2M=0;
        //奇偶数位上出现次数最多的数
        int ans1,ans2;

        //遍历数组,奇数为统计m1,M1,ans1;偶数位统计m2,M2,ans2
        for(int i=0;i<n;i++)
        {
            if(i%2==0)//偶数位
            {
                ++m1[nums[i]];
                if(M1<m1[nums[i]])
                {
                    ans1=nums[i];
                    M1=m1[nums[i]];
                }
            }
            else//奇数位
            {
                ++m2[nums[i]];
                if(M2<m2[nums[i]])
                {
                    ans2=nums[i];
                    M2=m2[nums[i]];
                }
            }
        }   
        //cout<<ans1<<'\t'<<ans2<<endl;

        //如果奇数位和偶数位上出现次数最多的数相同,就得寻找次多的数
        //因为题目不允许出现所有数都相同的情况
        //此时最少次数应为:
        //m1中出现最多的次数与m2中出现次多的次数
        //或
        //m1中出现次多的次数与m2中出现最多的次数
        if(ans1==ans2)
        {
            for(auto [key,value]:m1)
            {
                if(key!=ans1 && M1M<value)
                {
                    M1M=value;
                }
            }
            for(auto [key,value]:m2)
            {
                if(key!=ans1 && M2M<value)
                {
                    M2M=value;
                }
            }
            //结果为数组长度减去出现最多但却不相同的两个数
            return n-max(M1+M2M,M2+M1M);
        }
        else 
            //如果出现次数最多的数不相同,直接求解即可
            return n-M1-M2;


        

    }
};

作者:kutu1bw-i
链接:https://leetcode.cn/problems/minimum-operations-to-make-the-array-alternating/solution/cha-xi-biao-zui-duo-ci-duo-jie-fa-by-kut-gxci/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值