python-leetcode-3396. 使数组元素互不相同所需的最少操作次数

3396. 使数组元素互不相同所需的最少操作次数 - 力扣(LeetCode)

可以使用贪心+哈希集合的方法来解决这个问题:

  1. 维护一个哈希集合 seen 来存储已经出现过的元素。
  2. 遍历数组 nums,检查当前元素是否已经在 seen 中:
    • 如果存在重复元素,就必须执行一次移除操作,即从开头移除 3 个元素。
    • 记录移除的次数,并清空 seen,从新的数组起点重新检查。
  3. 继续执行操作,直到 nums 变为空或所有元素互不相同。
  4. 返回执行操作的次数。

实现代码如下:

def minOperations(nums):
    seen = set()
    ops = 0  # 记录操作次数
    i = 0  # 指向数组当前遍历的位置

    while i < len(nums):
        if nums[i] in seen:
            # 发现重复元素,移除前三个元素
            ops += 1
            nums = nums[3:] if len(nums) >= 3 else []
            seen.clear()  # 清空集合
            i = 0  # 重置索引
        else:
            seen.add(nums[i])
            i += 1

    return ops

复杂度分析:

  • 最坏情况下,每次操作删除 3 个元素,因此最多执行 O(n/3) 次操作,即 O(n)
  • 使用哈希集合存储唯一元素,每次操作 O(1),总时间复杂度约为 O(n)

这个方法可以保证最小的移除次数,使得 nums 互不相同。你可以提供一些测试用例来验证它的正确性!🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值