题目描述:
有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。
对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] xor arr[Li+1] xor ... xor arr[Ri])作为本次查询的结果。
并返回一个包含给定查询 queries 所有结果的数组。
解题分析:
最开始使用暴力法,会超时间,主要是计算各个区间的异或值存在大量的重复计算。
class Solution {
public:
vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
vector<int> ans;
vector<int> prefixSum(arr.size()+1);
for(int i=0; i<arr.size(); ++i){
prefixSum[i+1]=prefixSum[i]^arr[i];
}
for(vector<int> querie : queries){
ans.push_back(prefixSum[querie[0]]^prefixSum[querie[1]+1]);
}
return ans;
}
};
优化:
看到好多个输入,每个输入是个区间,同时结合异或的性质,可以考虑用前缀和;
使用一个数组prefixSum记录arr[0]~arr[i]的异或值;
对于查询某一区间[l,r]的异或值,可以通过计算prefixSum[r+1]^prefixSum[l]得到,注意prefixSum[0]=0。
class Solution {
public:
vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
vector<int> ans;
vector<int> prefixSum(arr.size()+1);
for(int i = 0; i<arr.size(); ++i){
prefixSum[i+1]=prefixSum[i]^arr[i];
}
for(vector<int> querie : queries){
ans.push_back(prefixSum[querie[0]]^prefixSum[querie[1]+1]);
}
return ans;
}
};