📌  相关文章
📜  给定数组的所有子数组的按位或运算的总和|套装2(1)

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

给定数组的所有子数组的按位或运算的总和

题目描述

给定一个整数数组 nums,对于数组的每个子数组 subarray,我们计算该子数组的所有元素按位或的结果,将所有子数组的结果累加起来,并返回最终结果。

示例

输入:nums = [1,2,4]

输出:7

解释:

子数组按位或的结果:
[1] = 1
[1, 2] = 3
[1, 2, 4] = 7
[2] = 2
[2, 4] = 6
[4] = 4

总和为 1 + 3 + 7 + 2 + 6 + 4 = 23

解题思路

题目要求对于每个子数组计算按位或的结果,并将所有子数组的结果累加起来。因此,我们需要枚举所有的子数组,并计算它们的按位或结果。然后将所有的结果累加起来即可。

在实现过程中,我们可以使用位运算中的或运算符 | 来进行按位或运算。同时,为了避免重复计算,我们可以使用两个指针 leftright 来表示当前子数组的左右边界,并在枚举子数组时更新这两个指针。

具体实现见下方代码片段。

class Solution:
    def subarrayBitwiseORs(self, nums: List[int]) -> int:
        ans = set()
        left, right = 0, 0
        for num in nums:
            left, right = right, len(ans)
            ans.add(num)
            for i in range(left, right):
                ans.add(ans[i] | num)
        return len(ans)
复杂度分析
  • 时间复杂度:$O(n^2)$,其中 $n$ 是数组的长度。枚举所有子数组的时间复杂度为 $O(n^2)$,而计算每个子数组的按位或的结果的时间复杂度为 $O(n)$,因此总时间复杂度为 $O(n^2)$。
  • 空间复杂度:$O(n)$。需要使用额外的空间保存计算出的所有子数组的按位或结果,最坏情况需要 $O(n)$ 的空间。