Leetcode 3022. Minimize OR of Remaining Elements Using Operations

  • Leetcode 3022. Minimize OR of Remaining Elements Using Operations
    • 1. 解题思路
    • 2. 代码实现
  • 题目链接:3022. Minimize OR of Remaining Elements Using Operations

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的含义的大佬请务必在评论区指导一下,真心看晕了,万分感谢!!!

你可能感兴趣的:(leetcode笔记,leetcode,3022,leetcode,hard,leetcode周赛382,leetcode题解,位运算)