1310. 子数组异或查询

题目描述:

有一个正整数数组 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;
    }
};

 

上一篇:firewalld 防火墙


下一篇:程序员面试金典 - 面试题 17.24. 最大子矩阵(转成一维最大子序和 DP)