给你一个下标从 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] 更改 为 任一 正整数。
返回使数组变成交替数组的 最少操作数 。
- 输入:nums = [3,1,3,2,4,3]
- 输出:3
- 解释:
- 使数组变成交替数组的方法之一是将该数组转换为 [3,1,3,1,3,1] 。
- 在这种情况下,操作数为 3 。
- 可以证明,操作数少于 3 的情况下,无法使数组变成交替数组。
- 输入:nums = [1,2,2,2,2]
- 输出:2
- 解释:
- 使数组变成交替数组的方法之一是将该数组转换为 [1,2,1,2,1].
- 在这种情况下,操作数为 2 。
- 注意,数组不能转换成 [2,2,2,2,2] 。因为在这种情况下,nums[0] == nums[1],不满足交替数组的条件。
1 <= nums.length <= 1051 <= nums[i] <= 105注:可能奇数和偶数的出现频率最高的数字一致,则需考虑次高选项
- class Solution(object):
- def minimumOperations(self, nums):
- """
- :type nums: List[int]
- :rtype: int
- """
- count = 0 # 计算奇数项与偶数项(二者值不同)出现频率最高数字的总和
- count1 = 0
- count2 = 0
- n = len(nums)
- if len(nums) == 1: # 出现[1]则无需操作
- return 0
- else:
- # 计算偶数项出现频率最高的前两项
- a_most = Counter([y for x,y in enumerate(nums) if x%2 == 0]).most_common(2)
- # 计算奇数项出现频率最高的前两项
- b_most = Counter([y for x,y in enumerate(nums) if x%2 != 0]).most_common(2)
- # 先取奇数项与偶数项出现频率最高的数
- a = a_most[0][0]
- b = b_most[0][0]
- # 若奇数项和偶数项出现频率最高的数值相等
- if a==b:
- if len(a_most)==1 and len(b_most)==1: # 类似[2,2]或[1,1,1,1,1]的情况
- return n//2
- elif len(a_most)>1: # 防止出现下标超出数组长度情况
- # 计算取奇数出现频率最高数值的次数与偶数出现频率次高数值的次数之和
- count1 = a_most[1][1]+b_most[0][1]
- if len(b_most)>1:
- # 计算取偶数出现频率最高数值的次数与奇数出现频率次高数值的次数之和
- count2 = a_most[0][1]+b_most[1][1]
- # 比较二者大小
- if count1 > count2:
- count = count1
- else:
- count = count2
- else: # 奇数和偶数出现频率最高数值不等
- count = a_most[0][1] + b_most[0][1]
- return n - count
注: