LeetCode题解——子数组异或查询
- 题目介绍
- 思路分析
- 题目中有两个vector,第一个arr是存放的所有元素,第二个queries是存放的arr数组元素的起始和结束下标
- 第一种方法是遍历queries,然后每次遍历一边arr取得异或结果保存,时间复杂度n*n
- 第二种方法已知特性a^a = 1,那么我们可以先求出arr前1,2,3所有的异或值,放在一个参考字典dict里面,dict[i]表示arr前i个元素的异或。
- 然后遍历queries,获取起始和结束位置left,right,dict[left-1]^dict[right]就是需要求的结果了,这种方法时间复杂度n+n,不过牺牲了空间。
- 代码示例
class Solution {
public:
vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
int len = arr.size();
int qlen = queries.size();
vector<int> res;
vector<int> dict(len,0);
dict[0] = arr[0];
for(int i = 1;i<len;i++){
dict[i] = dict[i-1] ^ arr[i];
}
for(int i = 0; i<qlen; i++) {
if(queries[i][0] == 0) {
res.push_back(dict[queries[i][1]]);
}else{
res.push_back(dict[queries[i][0]-1]^dict[queries[i][1]]);
}
}
return res;
}
};