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
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南岸青栀*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值