题目链接
分析
对于美丽子数组来说,统计其中所有数在二进制下 $1$ 的位置,每一个位置的数量均为偶数
故原问题等价于判断数组异或和是否为 $0$
又异或操作满足结合律,且任何数于其自身做异或操作为 $0$
所以我们使用前缀和来计算子数组的异或和,使用哈希表记录前缀数组异或和出现的次数
遍历计算即可
代码实现
class Solution {
public:
long long beautifulSubarrays(vector<int>& nums) {
long long ans = 0;
int t = 0;
unordered_map<int, int> um;
um[0] = 1;
for(int x : nums) {
t ^= x;
ans += um[t]++;
}
return ans;
}
};
复杂度分析
- 时间复杂度:$O(n)$
- 空间复杂度:$O(n)$