📌  相关文章
📜  至少一个非空子数组按位与的数字(1)

📅  最后修改于: 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;
}