📜  所有子数组的按位与之和(1)

📅  最后修改于: 2023-12-03 15:25:44.390000             🧑  作者: Mango

所有子数组的按位与之和

简介

在这道题中,给定一个整数数组,我们需要计算数组中所有子数组的按位与之和。其中子数组是在原数组中连续的一段元素。

方法

我们可以遍历整个数组,计算每个子数组的按位与结果,最终将所有结果相加即可得到答案。

具体来说,我们可以从第一个元素开始,将当前元素设为子数组的第一个元素,然后不断向后扩展子数组,直到子数组包含了整个原数组。在扩展子数组时,我们可以利用按位与的性质,即相同位上只有当两个数都为 1 时,按位与的结果才为 1。因此,我们可以将新加入的元素与已有的按位与结果相与,以得到扩展后的按位与结果。

具体实现可参考下方代码片段。

代码
class Solution:
    def subarrayBitwiseORs(self, A: List[int]) -> int:
        ans, curr = set(), set()
        for a in A:
            curr = {a | b for b in curr} | {a}
            ans |= curr
        return len(ans)
复杂度分析

时间复杂度:O(nw),其中 n 是数组的长度,w 是数的二进制位数。遍历整个数组需要 O(n) 的时间。对于每个子数组,我们需要计算它们的按位与结果,时间复杂度为 O(w)。

空间复杂度:O(nw)。在计算所有子数组的按位与结果时,我们使用了一个集合来存储中间结果,因此空间复杂度为 O(nw)。