Leetcode 3022. Minimize OR of Remaining Elements Using Operations

探讨LeetCode问题3022的解法,关注位操作和限制次数下的最优策略,包含Python代码示例。作者求解过程中的难点在于处理非连续数带来的干扰。
摘要由CSDN通过智能技术生成

1. 解题思路

这道题坦率地说其实不太想写这篇题解,因为其实自己根本没有搞定,甚至说看了大佬的解答也没有搞定,就真的不应该写的,不过整体上的思路其实倒是想到的,和大佬们的思路如出一辙,所以还是决定写写,把我自己的理解和有问题的地方说说,然后摘录一下大佬们的code,如果有人可以理解的话,请务必在评论区解释一下,万分感谢。

这道题思路的话整体上来说就是按位进行考察,从最高位到最低位,看看在不超过k次操作的前提下可以确保哪几个位上的数字被清零。

而对应的情况,就是假设我们考察第n位,只需要考察有多少个数在第n位上为1,那么我们就至少需要n次操作才能确保留下的数当中第 n n n为0。

当然,不同的位在消除的过程当中会有重合,这个倒也不是什么大问题。

唯一的问题是,要消除这些数,如果他们不连续的情况下会引入其他的数,这样的情况下会导致另一些位上受到干扰,这个干扰的情况我一直没有想的很明白,看大佬们的代码也没有看明白他们是怎么操作的,就很不爽……

2. 代码实现

给出大佬的python代码实现如下:

class Solution:
    def minOrAfterOperations(self, nums: List[int], k: int) -> int:
        mask = 0
        for i in range(29, -1, -1):
            mask |= 1 << i
            cnt = 0
            carry = 0
            for x in nums:
                if carry != 0:
                    carry = carry & x & mask
                    cnt += 1
                else:
                    carry = x & mask
            if carry != 0:
                cnt += 1
            if cnt > k or cnt == len(nums):
                mask ^= 1 << i
        return ((1 << 30) - 1) ^ mask

又能够看明白其中carry的含义的大佬请务必在评论区指导一下,真心看晕了,万分感谢!!!

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值