解题思路
根据题意,求出最少的操作数,即分别在奇数位和偶数位上求出出现最多的数,统计这两个数的出现次数,所求即为总长度减去这两个数的出现次数(即将其他数修改为这两个数)。
又因为题目不允许所有数都相同,所以应在出现最多次的数相同时判断次多出现的数,即所求为总长度减去(奇数位出现最多的数的次数+偶数位出现次多的数的次数)与(奇数位出现次多的数的次数+偶数位出现最多的数的次数)两者中较小的一个。
具体实现与思路已经在代码中注释。
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。