1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# @Title: 使数组变成交替数组的最少操作数 (Minimum Operations to Make the Array Alternating)
# @Author: 15816537946@163.com
# @Date: 2022-02-13 12:46:26
# @Runtime: 196 ms
# @Memory: 31.2 MB
class Solution:
    def minimumOperations(self, nums: List[int]) -> int:
        
        n = len(nums)
        if n == 1:
            return 0
        
        cnt0 = Counter(nums[::2])   # 从0开始,间隔为2
        cnt1 = Counter(nums[1::2])  # 从1开始,间隔为2
        
        cnt0 = sorted(cnt0.items(), key=lambda x: -x[1])    # 按照出现次数倒序排列
        cnt1 = sorted(cnt1.items(), key=lambda x: -x[1])
        
        if cnt0[0][0] != cnt1[0][0]:    # 两个数组中,出现次数最多的元素不同
            return n-cnt0[0][1]-cnt1[0][1]
        else:                           # 两个数组中,出现次数最多的元素相同
            cost0 = n - cnt0[0][1] - (0 if len(cnt1)==1 else cnt1[1][1])    # 保留第一个数组中出现次数最多的元素,并考虑保留第二个数组中出现次数第二多的元素
            cost1 = n - cnt1[0][1] - (0 if len(cnt0)==1 else cnt0[1][1])    # 保留第二个数组中出现次数最多的元素,并考虑保留第一个数组中出现次数第二多的元素
            
            return min(cost0, cost1)    # 两种情况取最小值