前往
大廳
主題

LeetCode - 2680. Maximum OR 解題心得

Not In My Back Yard | 2024-04-14 14:00:08 | 巴幣 0 | 人氣 37

題目連結:


題目意譯:
你被給定一個索引值從 0 開始數且長度為 n 的整數陣列 nums 以及一整數 k。在一次操作中,你可以選擇一個元素並將其值乘以 2。

回傳藉由最多 k 次操作可以得到的 nums[0] | nums[1] | ... | nums[n - 1] 之最大值。

注意到 a | b 代表著兩整數 a 和 b 按位元 OR 之操作。

限制:
1 ≦ nums.length ≦ 10 ^ 5
1 ≦ nums[i] ≦ 10 ^ 9
1 ≦ k ≦ 15



範例測資:
範例 1:
輸入: nums = [12,9], k = 1
輸出: 30
解釋: 如果我們對索引值 1 執行一次操作,我們新的陣列 nums 變為 [12,18]。因此,我們回傳 12 和 18 按位元 OR 之值,其為 30。

範例 2:
輸入: nums = [8,1,2], k = 2
輸出: 35
解釋: 如果我們對索引值 0 執行兩次操作,我們新的陣列 nums 變為 [32,1,2]。因此,我們回傳 32|1|2 = 35。


解題思維:
首先,我們可以看到這 k 次操作在最佳解中應當集中套用在同一個數字上。由於證明只是一個單純的反證法——即假設最佳解不是 k 次操作集中在同一個數字,然後你就會發現改成集中在同一個數字上會產出更大的結果。故而矛盾。細節就不贅述了。

那要選哪個數字呢?不知道。既然不知道那就全做,因此我們先計算出所有可能的前綴 OR 結果和後綴 OR 結果。然後再掃過每一個索引值 i,把 k 次操作都套用在 nums[i] 上試試看,而結果將會是
    0 ~ i - 1 這個前綴的 OR 結果 | nums[i] × (2 ^ k) | i + 1 ~ nums.length - 1 這個後綴之 OR 結果
取所有索引值中的結果最大值即可。




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

創作回應

更多創作