Leetcode每日刷题【中】--Day 12

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 每找到一个iiii满足等式,就能多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

今天就打卡而已吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JamePrin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值