python 两个数组是否相等_leetcode第188周赛第二题——形成两个异或相等数组的三元组数目...

leetcode5405. 形成两个异或相等数组的三元组数目

给你一个整数数组 arr

现需要从数组中取三个下标 ijk ,其中 (0 <= i < j <= k < arr.length)

a 和 b 定义如下:

a = arr[i] ^ arr[i + 1] ^ ... ^ arr[j - 1]
b = arr[j] ^ arr[j + 1] ^ ... ^ arr[k]

注意:^ 表示 按位异或 操作。

请返回能够令 a == b 成立的三元组 (i, j , k) 的数目。

示例 1:

输入:arr = [2,3,1,6,7]
输出:4
解释:满足题意的三元组分别是 (0,1,2), (0,2,2), (2,3,4) 以及 (2,4,4)

示例 2:

输入:arr = [1,1,1,1,1]
输出:10

示例 3:

输入:arr = [2,3]
输出:0

示例 4:

输入:arr = [1,3,5,7,9]
输出:3

示例 5:

输入:arr = [7,11,12,9,5,2,7,17,22]
输出:8

提示:

1 <= arr.length <= 300
1 <= arr[i] <= 10^8

方法:

思路:

这题最容易想到的是暴力法,通过i,j,k三个循环,直接求出a,b,然后判断a与b是否相等,相等即为一种答案。这种方法会导致超时。

优化1:

继续想办法优化,因为每次都要计算许多数的异或,肯定会有重复,根据异或的性质,我得出以下性质:

若arr[0] ^ arr[1] ^ ... ^arr[k] = (arr[0] ^ ... ^ arr[i-1]) ^ (arr[i] ^ ... ^arr[k])

则arr[i] ^ ... ^ arr[k] = (arr[0] ^ ... ^arr[i-1]) ^ (arr[0] ^ arr[1] ^ ... ^arr[k])

由上面的公式可以看出,我们使用dp数组来存放前i个数据异或和的结果。那么在求a和b的过程中,就省去了异或计算,a = dp[i-1] ^ dp[j-1] (i==0时再做一个边界处理),b = dp[j-1] ^ dp[k]

这样省去了许多时间。那么我们还有优化的方法吗?

优化2:

我们可以在上面的基础上继续优化。a == b 等价于 a ^ b == 0

那么我们的问题就转换为了arr[i] ^ arr[i+1] ^ ... ^arr[k] == 0,可以看到与j的取值无关,只要$jin(i,k]$即可满足条件。那么我们就将循环从三层循环降为两层循环,i和k,使用x计算arr[i] ^ arr[i+1] ^ ... ^arr[k] 。计算方法同样是调用dp数组。如果 x == 0,那么这种情况下就有 k-i个满足条件的(i,j,k)。

代码:

class Solution:
    def countTriplets(self, arr: List[int]) -> int:
        n = len(arr)
        dp = [0 for _ in range(n)]
        for i in range(n):    #使用dp数组,存放前i个数异或和结果
            if i == 0:
                dp[i] = arr[i]
            else:
                dp[i] = dp[i-1] ^ arr[i]
        ans = 0
        #print(dp)
        for i in range(0,n-1):
            for k in range(i,n):
                x = 0 #x存放arr[i]^...^arr[k]结果,x=0,则a=b
                if i == 0:
                    x = 0 ^ dp[k] #i=0,则dp[k]即为arr[i]^...^arr[k]结果
                else:
                    x = dp[i-1] ^ dp[k]  #i!=0,则dp[i-1]^dp[k]即为arr[i]^...^arr[k]结果 
                if x == 0 : 
                    ans += k-i #如果x = 0,说明a=b,则该种情况下有k-i种(i,j,k)可能
        return ans

结果:

python 两个数组是否相等_leetcode第188周赛第二题——形成两个异或相等数组的三元组数目..._第1张图片

下图展示出几次优化的提升效果

python 两个数组是否相等_leetcode第188周赛第二题——形成两个异或相等数组的三元组数目..._第2张图片

你可能感兴趣的:(python,两个数组是否相等)