算法练习9——收集元素的最少操作次数

LeetCode 8038 收集元素的最少操作次数

给你一个正整数数组 nums 和一个整数 k 。
一次操作中,你可以将数组的最后一个元素删除,将该元素添加到一个集合中。
请你返回收集元素 1, 2, …, k 需要的 最少操作次数 。

class Solution:
    def minOperations(self, nums: List[int], k: int) -> int:
        array = [0] * k
        times = 0
        for i in range(len(nums) - 1, -1, -1):
            times += 1
            if nums[i] <= k and array[nums[i] - 1] == 0:
                array[nums[i] - 1] = times
        return max(array)

还可以提前跳出循环

class Solution:
    def minOperations(self, nums: List[int], k: int) -> int:
        array = [0] * k
        times = 0
        p = 0
        for i in range(len(nums) - 1, -1, -1):
            times += 1
            if nums[i] <= k and array[nums[i] - 1] == 0:
                array[nums[i] - 1] = times
                p += 1
            if p == k:
                break
        return max(array)

上面的计数数组就是一个哈希表map,本题正好可以使用bit压缩数组
由于元素范围在 [1,50],我们可以用一个 64 位整数表示集合

class Solution:
    def minOperations(self, nums: List[int], k: int) -> int:
        u = (2 << k) - 2  # 1~k
        s, n = 0, len(nums)
        for i in range(n - 1, -1, -1):
            s |= 1 << nums[i]
            if (s & u) == u:
                return n - i

# 作者:灵茶山艾府
# 链接:https://leetcode.cn/problems/minimum-operations-to-collect-elements/
# 来源:力扣(LeetCode)
# 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值