前往
大廳
主題

LeetCode - 2317. Maximum XOR After Operations  解題心得

Not In My Back Yard | 2023-05-23 12:00:04 | 巴幣 0 | 人氣 187

題目連結:


題目意譯:
你被給定一個索引值從 0 開始整數陣列 nums。在一次操作中,選擇任何一個非負整數整數 x 以及索引值 i,然後將 nums[i] 更新為 nums[i] AND (nums[i] XOR x)。

注意到 AND 為按位元「和」操作而 XOR 為按位元「互斥或」操作。

回傳經過任意次數的操作套用到 nums 之後,nums 中所有元素最大可能的按位元 XOR 之值為何。

限制:
1 ≦ nums.length ≦ 10 ^ 5
0 ≦ nums[i] ≦ 10 ^ 8



範例測資:
範例 1:
輸入: nums = [3,2,4,6]
輸出: 7
解釋: 以 x = 4 和 i = 3 執行操作,nums[3] = 6 AND (6 XOR 4) = 6 AND 2 = 2。
現在 nums = [3, 2, 4, 2] 而所有元素按位元 XOR 之結果 = 3 XOR 2 XOR 4 XOR 2 = 7。
可以證明 7 最大可能的按位元 XOR 之值。
注意到有其他操作同樣可以達成按位元 XOR 之值為 7 的結果。

範例 2:
輸入: nums = [1,2,3,9,2]
輸出: 11
解釋: 執行零次的操作。
所有元素按位元 XOR 之結果 1 XOR 2 XOR 3 XOR 9 XOR 2 = 11。
可以證明 11 最大可能的按位元 XOR 之值。


解題思維:
仔細觀察可以發現 nums[i] AND (nums[i] XOR x) 可以把 nums[i] 二進位表示法中某位元的 1 變成 0。

而由於最後的結果是所有數字 XOR 在一起,且其值要最大化。因此我們要盡可能把結果中可以變成 1 的位元都變成 1。而可以變成 1 的位元代表著某些數字(假設有 C 個)必定滿足該位元為 1。

如果 C 是偶數,則 XOR 後該位元是 0,所以我們要想辦法把 C 變成奇數。因此根據操作挑出 C 個數字中某個數字然後將該位元藉由操作變成 0 即可。

也因此,我們可以看到只要某數字的某位元是 1,則我們一定可以在結果中把對應的位元也變成 1。

所以掃過所有數字,看結果中最後哪些位元可以變成 1 即可求出結果最大值。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作