LeetCode:1442. 形成两个异或相等数组的三元组数目
Posted 南岸青栀*
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode:1442. 形成两个异或相等数组的三元组数目相关的知识,希望对你有一定的参考价值。
1442. 形成两个异或相等数组的三元组数目
法1:四重循环
python超时
class Solution:
def countTriplets(self, arr: List[int]) -> int:
count = 0
#暴力法
for i in range(len(arr)):
for j in range(i+1,len(arr)):
for k in range(j,len(arr)):
a = arr[i]
b = arr[j]
for a1 in range(i+1,j):
a ^= arr[a1]
for b1 in range(j+1,k+1):
b ^= arr[b1]
if a == b:
count += 1
return count
整理思路,
计算异或前缀和
法2:三重循环
class Solution:
def countTriplets(self, arr: List[int]) -> int:
#法2计算异或前缀和
count = 0
s = [0]
for i in arr: s.append(s[-1]^i)
for i in range(len(arr)):
for j in range(i+1,len(arr)):
for k in range(j,len(arr)):
if s[i] == s[k+1]:
count +=1
return count
法3:二重循环
等式成立:
[i+1,k] 的范围内的任意 j 都是符合要求的,对应的三元组个数为 k-i
。因此我们只需枚举下标 i 和 k
class Solution:
def countTriplets(self, arr: List[int]) -> int:
#法3二重循环
count = 0
s = [0]
for i in arr: s.append(s[-1]^i)
for i in range(len(arr)):
for k in range(i+1,len(arr)):
if s[i] == s[k+1]:
count += k - i
return count
法4:一重循环
class Solution:
def countTriplets(self, arr: List[int]) -> int:
#法4:一重循环
n = len(arr)
s = [0]
for val in arr:
s.append(s[-1] ^ val)
cnt, total = Counter(), Counter()
ans = 0
for k in range(n):
if s[k + 1] in cnt:
ans += cnt[s[k + 1]] * k - total[s[k + 1]]
cnt[s[k]] += 1
total[s[k]] += k
return ans
补充:
Counter目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)
优化法4
class Solution:
def countTriplets(self, arr: List[int]) -> int:
#优化
cnt, total = Counter(), Counter()
ans = s = 0
for k, val in enumerate(arr):
print(k,val)
if (t := s ^ val) in cnt:
ans += cnt[t] * k - total[t]
cnt[s] += 1
total[s] += k
s = t
return ans
以上是关于LeetCode:1442. 形成两个异或相等数组的三元组数目的主要内容,如果未能解决你的问题,请参考以下文章
算法leetcode1442. 形成两个异或相等数组的三元组数目(rust真是好用)
算法leetcode1442. 形成两个异或相等数组的三元组数目(rust真是好用)
leetcode1442. 形成两个异或相等数组的三元组数目
LeetCode 1442. 形成两个异或相等数组的三元组数目