LC 3022. 给定操作次数内使剩余元素的或值最小

https://leetcode.cn/problems/minimize-or-of-remaining-elements-using-operations/description/

这题看了题解。我大致想到了按照bit去不断check, 但是做法是先按照某个fixed bit按照贪心算法去消除,然后考虑下一个fixed bit. 但是这种思路的问题就是没有综合考虑前面的fixed bit对后面的影响。

题解的思路和我的框架差不多,但是并不是每次选出来就立刻消除,而是将本次筛选出来的结果带到下一轮一起考虑。其中mask表示的是之前筛选出来的结果,先假设这个fixed bit是可以消除的,结合上一轮的情况看看 `cnt <= k`.

class Solution:
    def minOrAfterOperations(self, nums: List[int], k: int) -> int:
        ans = 0
        mask = 0

        bit_count = 0
        M = max(nums)
        while (1 << bit_count) <= M:
            bit_count += 1

        for test_b in reversed(range(0, bit_count)):
            mask |= (1 << test_b)
            cnt = 0
            and_res = -1
            for x in nums:
                and_res = and_res & (x & mask)
                if and_res:
                    cnt += 1
                else:
                    and_res = -1
            if cnt > k:
                ans |= (1 << test_b)
                mask &= ~(1 << test_b)
        return ans