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. 形成两个异或相等数组的三元组数目

LeetCode 1442. 形成两个异或相等数组的三元组数目 Java

LeetCode 1442. 形成两个异或相等数组的三元组数目 Java