📅  最后修改于: 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记录每个数的按位或结果和整个数组的按位或结果。
因此,该算法可以通过本题。