📜  给定数组中所有无序对的按位或(1)

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

给定数组中所有无序对的按位或

问题描述:

给定一个整数数组nums,对于所有不同的i、j(其中0 ≤ i < j ≤ nums.length-1),求nums[i]和nums[j]的按位或运算结果的和。

解题思路:

本题需要求解的是所有无序数对(i,j),因此需要使用两个for循环遍历数组nums,同时记录每个数的按位或的结果,将所有结果累加即为所求的答案。

以示例数组nums=[1,2,3,4,5]为例,按位或运算的结果如下所示:

1 | 2 = 3
1 | 3 = 3
1 | 4 = 5
1 | 5 = 5
2 | 3 = 3
2 | 4 = 6
2 | 5 = 7
3 | 4 = 7
3 | 5 = 7
4 | 5 = 5

将所有结果进行累加得:3+3+5+5+3+6+7+7+5=44。

因此,本题可以使用以下代码实现:

class Solution:
    def subarrayBitwiseORs(self, nums: List[int]) -> int:
        res = set()
        cur = set()
        for num in nums:
            cur = {num | j for j in cur} | {num}
            res |= cur
        return len(res)
复杂度分析:
  • 时间复杂度:O(nlogn),其中n为数组nums的长度。由于使用了set去重,内循环的复杂度为O(logn),外循环遍历了n个元素,因此总时间复杂度为O(nlogn)。

  • 空间复杂度:O(n),使用了set记录每个数的按位或结果和整个数组的按位或结果。

因此,该算法可以通过本题。