1442. 形成两个异或相等数组的三元组数目
思路比较简单,但是时间复杂度太高,一旦数据给得比较大就没了
这里采用的是前缀异或,然后根据题目要求求解。(初次代码)
class Solution:
def countTriplets(self, arr: List[int]) -> int:
xor_arr = [0]
count = 0
for i in arr:
xor_arr.append(i^xor_arr[-1])
length = len(xor_arr)
for i in range(length-1):
for ii in range(i+1, length):
for iii in range(ii, length-1):
if xor_arr[i]^xor_arr[ii] == xor_arr[ii]^xor_arr[iii+1]:
count += 1
return count
化简:
第十一行似乎可以利用异或的原理消掉一些东西 xor_arr[i]^xor_arr[ii] == xor_arr[ii]^xor_arr[iii+1]
可以写成xor_arr[i] == xor_arr[iii+1]
,减少计算时间
继续优化:(以下思路学习于官网题解)
上边找到的区间在i 和 iii 中,如果满足等式,就和ii是谁没有关系了,所以在[i,iii]
内任选一个ii
就能满足一盒三元组合。
组合数有 iii-i
每找到一个i
和iii
满足等式,就能多iii-i
个组合
三层循环就能优化成二层循环了!
for i in range(length-1):
for iii in range(i+1, length-1):
if xor_arr[i] ==xor_arr[iii+1]:
count += iii - i
再次优化(公式化简)
对于上边的iii - i,iii = k
。
cnt = Counter()
total = Counter()
for k in range(length-1):
if xor_arr[k + 1] in cnt:
count += cnt[xor_arr[k + 1]] * k - total[xor_arr[k + 1]]
cnt[xor_arr[k]] += 1
total[xor_arr[k]] += k
今天就打卡而已吧。