1310. 子数组异或查询

Posted Mrsdwang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1310. 子数组异或查询相关的知识,希望对你有一定的参考价值。

思路:
还是异或的题。
因为我们前一道题已经得到一个算法,(3 ^ 4 ^ 5) = (1 ^ 2) ^ (1 ^ 2 ^ 3 ^ 4 ^ 5),所以在这题也可以通过该算法来减少异或次数。
我们有个很直接的想法就是从queries没获取一个查询范围,就从L-R的异或,那么最坏时间复杂度就是O(n*m),因为n个查询范围可能查询m个数组项来异或。
通过上述的算法我们能简化到O(n)的时间复杂度。
所以我们要求解前缀异或结果,加入我们得到的查询范围是[2,3],那么我们通过前缀异或结果[0,1] ^ [0,3] 即可得到2 ^ 3的结果,只用进行一次异或。

所以我们通过一个数组记录0-i的异或结果,最后每获得一个查询范围直接用前缀异或结果异或即可。

代码:

class Solution {
public:
    vector<int> xorQueries(vector<int>& arr, vector<vector<int>>& queries) {
        int n1 = arr.size();
        int n2 = queries.size();
        vector<int> prexor(n1);
        vector<int> res;
        int now=0;
        for(int i=0;i<n1;++i){
            now = now^arr[i];
            prexor[i]=now;
        }
        for(int i=0;i<n2;++i){
            if(queries[i][0]>0){  //因为[0,1] ^ [0,3] = 2 ^ 3 ,所以要L要减1,但L为0就不用处理,直接从前缀异或结果获得结果。所以要用if判断呢
                int resxor = prexor[queries[i][1]]^prexor[queries[i][0]-1];
                res.push_back(resxor);
                continue;
            }
            res.push_back(prexor[queries[i][1]]);
            
        }
        return res;
    }
};

以上是关于1310. 子数组异或查询的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 1310 子数组异或查询[位运算 异或] HERODING的LeetCode之路

1310. 子数组异或查询

1310. 子数组异或查询

1310. 子数组异或查询

LeetCode1310. 子数组异或查询 / 307. 区域和检索 - 数组可修改(线段树树状数组)

LeetCode 1310. 子数组异或查询 Java/C++ 前缀和