Counter()函数:Counter是dict子类,用于计数可哈希的对象。元素被作为字典的key存储,它们的计数作为字典的value存储
注意:Counter()函数返回的是字典
Counter().most_common([n]) 从多到少返回一个有前n多的元素的列表,即以[(元素1,次数),…,(元素n,次数)]返回出现次数前n的统计列表
class Solution:
def minimumOperations(self, nums: List[int]) -> int:
len_nums = len(nums)
if len_nums<=1:
return 0
elif len_nums==2:
return 0 if nums[0]!=nums[1] else 1
elif nums.count(nums[0]) == len_nums:
return len_nums//2
# m是偶数次项的元素出现频率top2统计
m = Counter(nums[::2]).most_common(2) # 利用Counter.most_common()取出次数最多的前两个元素[(元素1,次数),(元素2,次数)]
# n是奇数次项的元素出现频率top2统计
n = Counter(nums[1::2]).most_common(2)
a_most,b_most = m[0],n[0] # 取出频率最高的那个元组(元素,次数)
if a_most[0] == b_most[0]:
# 如果其中一段只有一种元素,那么将长的一段向后取元素
if len(m)> len(n):
a_most=m[1]
# 和上面的同理
elif len(m)<len(n):
b_most=n[1]
# 如果第一段:[(元素1,次数),(元素2,次数)]、第二段:[(元素1,次数),(元素3,次数)]
# 操作数最小需要对比每段top1元素出现次数与top2元素出现次数的差值,差值大表明需要做的操作多,即操作数大,所以要移动差值小的那段
elif (m[0][1]-m[1][1]) > (n[0][1]-n[1][1]):
b_most = n[1]
else:
a_most = m[1]
# return剩下需要操作的次数(总长度-nums[::2]段不需要修改的次数-nums[1::2]不需要修改的次数)
return len_nums - a_most[1] - b_most[1]