📅  最后修改于: 2023-12-03 15:41:24.854000             🧑  作者: Mango
给定一个非负整数数组,求至少包含一个非空子数组的按位与的数字。
例如,数组 [4,5,6,7] 的所有子数组为:
[4] [5] [6] [7] [4,5] [5,6] [6,7] [4,5,6] [5,6,7] [4,5,6,7]
它们的按位与的数字分别为:
4 5 6 7 4 4 6 4 4 4
其中,最小值为 4,因此返回 4。
考虑将数组中的所有数表示成二进制的形式,然后从高位到低位逐位进行判断。
对于第 k 位,若所有数的第 k 位都为 1,则最终答案的第 k 位也为 1;否则,最终答案的第 k 位为 0。
因此,我们可以从高位到低位枚举答案的每一位,通过移位运算得到这一位,再将所有数字按位与运算。
我们使用 mask 表示枚举到第 k 位时,它对应的二进制下的值。此时,我们遍历数组,计算所有数字按位与的结果。如果所有数字按位与的结果的二进制形式下第 k 位为 1,那么将答案的第 k 位也设为 1。
时间复杂度:O(n),其中 n 是数组的长度。
空间复杂度:O(1)。
class Solution:
def rangeBitwiseAnd(self, nums: List[int]) -> int:
mask = 2**30
res = 0
while mask > 0 and all(num & mask for num in nums):
res |= mask
mask >>= 1
return res
class Solution {
public int rangeBitwiseAnd(int[] nums) {
int mask = 1 << 30;
int res = 0;
while (mask > 0 && Arrays.stream(nums).allMatch(num -> (num & mask) != 0)) {
res |= mask;
mask >>= 1;
}
return res;
}
}
class Solution {
public:
int rangeBitwiseAnd(vector<int>& nums) {
int mask = 1 << 30;
int res = 0;
while (mask > 0 && all_of(nums.begin(), nums.end(), [&](int num) { return num & mask; })) {
res |= mask;
mask >>= 1;
}
return res;
}
};
int rangeBitwiseAnd(int* nums, int numsSize){
int mask = 1 << 30;
int res = 0;
while (mask > 0 && all_of(nums, nums + numsSize, [&](int num) { return num & mask; })) {
res |= mask;
mask >>= 1;
}
return res;
}