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