LeetCode第2588题-统计美丽子数组数目-python实现-图解思路与手撕代码
文章目录
一、题目描述
二、解题思路与代码实现
1.解题思路
美丽子数组就是子数组中所有元素的异或和为0,这不难理解,如果在一个数位上只有偶数个不为0,那么异或的结果就是0,如果奇数个不为0,那结果就是1。
我们可以求0到第i位的子数组的异或和,也就是前缀异或和,如果有两个前缀异或和相同,即0-i和0-j的前缀异或和相同,那么i-j的异或和为0,这不难理解,因为0-i这一部分重复了两次。
所以我们先求前缀异或和,然后对相同的元素加一,最后返回结果。
2.代码实现
代码如下(示例):
class Solution:
def beautifulSubarrays(self, nums: List[int]) -> int:
prefix=[0]
for i in nums:
prefix.append(i ^ prefix[-1])
cnt=Counter()
res=0
for x in prefix:
res+=cnt[x]
cnt[x]+=1
return res
其中可以输出前缀异或和看一下
输入:
[4,3,1,2,4]
输出:
[0, 4, 7, 6, 4, 0]
总结
这道题的难点在于理解,如何把问题转化成前缀异或和的个数的求解。