• 2170. 使数组变成交替数组的最少操作数


    题目链接:https://leetcode.cn/problems/minimum-operations-to-make-the-array-alternating/

    题目描述:

    给你一个下标从 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] 更改 为 任一 正整数。

    返回使数组变成交替数组的 最少操作数 。

    示例1:

    1. 输入:nums = [3,1,3,2,4,3]
    2. 输出:3
    3. 解释:
    4. 使数组变成交替数组的方法之一是将该数组转换为 [3,1,3,1,3,1] 。
    5. 在这种情况下,操作数为 3 。
    6. 可以证明,操作数少于 3 的情况下,无法使数组变成交替数组。

    示例2:

    1. 输入:nums = [1,2,2,2,2]
    2. 输出:2
    3. 解释:
    4. 使数组变成交替数组的方法之一是将该数组转换为 [1,2,1,2,1].
    5. 在这种情况下,操作数为 2
    6. 注意,数组不能转换成 [2,2,2,2,2] 。因为在这种情况下,nums[0] == nums[1],不满足交替数组的条件。

    提示:

    • 1 <= nums.length <= 105
    • 1 <= nums[i] <= 105

    解题思路:

    • 奇数下标和偶数下标的数字不能相同
    • 奇数下标的数字一致,偶数下标的数字一致
    • 使用列表长度-奇数中出现最多的数的次数-偶数中出现最多的数的次数

    注:可能奇数和偶数的出现频率最高的数字一致,则需考虑次高选项

    代码:

    1. class Solution(object):
    2. def minimumOperations(self, nums):
    3. """
    4. :type nums: List[int]
    5. :rtype: int
    6. """
    7. count = 0 # 计算奇数项与偶数项(二者值不同)出现频率最高数字的总和
    8. count1 = 0
    9. count2 = 0
    10. n = len(nums)
    11. if len(nums) == 1: # 出现[1]则无需操作
    12. return 0
    13. else:
    14. # 计算偶数项出现频率最高的前两项
    15. a_most = Counter([y for x,y in enumerate(nums) if x%2 == 0]).most_common(2)
    16. # 计算奇数项出现频率最高的前两项
    17. b_most = Counter([y for x,y in enumerate(nums) if x%2 != 0]).most_common(2)
    18. # 先取奇数项与偶数项出现频率最高的数
    19. a = a_most[0][0]
    20. b = b_most[0][0]
    21. # 若奇数项和偶数项出现频率最高的数值相等
    22. if a==b:
    23. if len(a_most)==1 and len(b_most)==1: # 类似[2,2]或[1,1,1,1,1]的情况
    24. return n//2
    25. elif len(a_most)>1: # 防止出现下标超出数组长度情况
    26. # 计算取奇数出现频率最高数值的次数与偶数出现频率次高数值的次数之和
    27. count1 = a_most[1][1]+b_most[0][1]
    28. if len(b_most)>1:
    29. # 计算取偶数出现频率最高数值的次数与奇数出现频率次高数值的次数之和
    30. count2 = a_most[0][1]+b_most[1][1]
    31. # 比较二者大小
    32. if count1 > count2:
    33. count = count1
    34. else:
    35. count = count2
    36. else: # 奇数和偶数出现频率最高数值不等
    37. count = a_most[0][1] + b_most[0][1]
    38. return n - count

    注:

    • enumerate(nums),返回值为下标,数值
    • Counter(nums)计算各个数值出现的频率
    • most_common(2)表示出现频率前两名
  • 相关阅读:
    已经有 MESI 协议,为什么还需要 volatile 关键字?
    苯硫酚荧光探针 激发波长465 nm
    03-3.1.3 栈的链式存储的实现
    大模型简介
    2022年最新前端面试题,持续更新
    Ubuntu22.04安装Go语言的几种方式
    小程序原生代码转uniapp
    数据结构---查找
    word图题表题公式按照章节编号(不用题注)
    Codeforces 403D Beautiful Pairs of Numbers(组合数学DP)
  • 原文地址:https://blog.csdn.net/chenyuhuaxin/article/details/126092066