记录
2025.5.9
题目:

思路:
1.计算初始或值:首先计算数组中所有元素的按位或结果 allOr,这表示在不进行任何左移操作时数组的或值。
2.计算固定或值:在计算 allOr 的同时,计算一个 fixed 值,这个值表示在左移某个元素时,其他元素的或结果。具体来说,fixed 是 allOr 与当前元素的与操作的结果的累积或。
3.尝试左移每个元素:对于数组中的每一个元素,将其左移 k 位后,计算新的或值。新的或值由三部分组成:
allOr ^ x:表示除了当前元素外其他元素的或结果。
fixed:表示在左移当前元素时其他元素的固定或部分。
x << k:当前元素左移 k 位后的值。
4.取最大值:在所有可能的左移操作中,选择最大的或值作为结果。
解题步骤:
1.初始化变量:allOr 初始化为0,用于累积所有元素的或结果;fixed 初始化为0,用于累积固定或部分。
2.计算 allOr 和 fixed:遍历数组,更新 fixed 为 fixed | (allOr & x),即当前元素与之前所有元素的或结果的与操作再或上之前的 fixed;更新 allOr 为 allOr | x,即累积或操作。
3.计算最大或值:再次遍历数组,对于每个元素 x,计算左移 k 位后的新或值。新或值由三部分组合而成:
allOr ^ x:排除当前元素后的或结果。
fixed:固定或部分。
x << k:当前元素左移 k 位后的值。
4.返回结果:在所有可能的左移操作中,取最大的或值作为最终结果。
代码:
java
class Solution {
public long maximumOr(int[] nums, int k) {
int allOr = 0;
int fixed = 0;
for (int x : nums) {
fixed |= allOr & x;
allOr |= x;
}
long ans = 0;
for (int x : nums) {
ans = Math.max(ans, (allOr ^ x) | fixed | ((long) x << k));
}
return ans;
}
}
复杂度:
O(N)
O(1)