首页 > 其他分享 >1310. 子数组异或查询 (Medium)

1310. 子数组异或查询 (Medium)

时间:2023-03-09 09:47:11浏览次数:58  
标签:arr Medium xor 1310 查询 异或 数组 queries

问题描述

1310. 子数组异或查询 (Medium)

有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Lᵢ, Rᵢ]

对于每个查询 i,请你计算从 LᵢRᵢXOR 值(即 arr[Lᵢ] xor arr[Lᵢ+1] xor ... xor arr[Rᵢ])作为本次查询的结果。

并返回一个包含给定查询 queries 所有结果的数组。

示例 1:

输入:arr = [1,3,4,8], queries = [[0,1],[1,2],[0,3],[3,3]]
输出:[2,7,14,8]
解释:
数组中元素的二进制表示形式是:
1 = 0001
3 = 0011
4 = 0100
8 = 1000
查询的 XOR 值为:
[0,1] = 1 xor 3 = 2
[1,2] = 3 xor 4 = 7
[0,3] = 1 xor 3 xor 4 xor 8 = 14
[3,3] = 8

示例 2:

输入:arr = [4,8,2,10], queries = [[2,3],[1,3],[0,0],[0,3]]
输出:[8,0,4,4]

提示:

  • 1 <= arr.length <= 3 * 10^4
  • 1 <= arr[i] <= 10^9
  • 1 <= queries.length <= 3 * 10^4
  • queries[i].length == 2
  • 0 <= queries[i][0] <= queries[i][1] < arr.length

解题思路

从本题的数据范围可知,我们需要时间复杂度为\(O(n)\)或者\(O(n\log_2 n)\)的算法,考虑异或的性质:\(A\oplus B\oplus A = B\),类似于前缀和的\(A + B - A = B\),因此我们可以考虑使用前缀异或数组来降低时间复杂度。

代码

class Solution {
  public:
    vector<int> xorQueries(vector<int> &arr, vector<vector<int>> &queries) {
        int n = arr.size();
        vector<int> prefix(n + 1);
        for (int i = 1; i <= n; ++i) {
            prefix[i] = (prefix[i - 1] ^ arr[i - 1]);
        }
        vector<int> res(queries.size());
        for (int i = 0; i < queries.size(); ++i) {
            res[i] = (prefix[queries[i][1] + 1] ^ prefix[queries[i][0]]);
        }
        return res;
    }
};

标签:arr,Medium,xor,1310,查询,异或,数组,queries
From: https://www.cnblogs.com/zwyyy456/p/17197126.html

相关文章

  • P4551 最长异或路径
    给定一棵nn个点的带权树,结点下标从11开始到nn。寻找树中找两个结点,求最长的异或路径。异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 处理出每个点......
  • Thinking--快速找出故障机器(异或)
    Thinking系列,旨在利用10分钟的时间传达一种可落地的编程思想。假设一个机器仅存储一个标号为ID(数值)的记录,且该数据会保存备份(即,两个机器存储了同样的数据;类似于双节点部署)......
  • 与&,或|,异或^运算
    与&,或|,异或^运算1.与&运算运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;两位同时为“1”,结果才为“1”,否则为0。2.或|运算运算规则:0|0=0;  0|1=1;  ......
  • 1599. 经营摩天轮的最大利润 (Medium)
    问题描述1599.经营摩天轮的最大利润(Medium)你正在经营一座摩天轮,该摩天轮共有4个座舱,每个座舱最多可以容纳4位游客。你可以逆时针轮转座舱,但每次轮转都需要......
  • 209. 长度最小的子数组 (Medium)
    问题描述209.长度最小的子数组(Medium)给定一个含有n个正整数的数组和一个正整数target。找出该数组中满足其和≥target的长度最小的连续子数组[numsₗ,num......
  • ENGG1310 P2.2 Data, Logic Gates & Binary Computation
    课程内容笔记,自用,不涉及任何assignment,exam答案Notesforself-use,donotincludeanyassignmentsorexamsDataRepresentations这里可以和前面介绍的数字信号/......
  • 异或值
    异或值给定一个长度为$n$的整数序列$a_1,a_2,\ldots,a_n$。请你找到一个非负整数$X$,使得$\max\limits_{1\leqi\leqn}\{a_i\oplusX\}$的值尽可能小,其中......
  • lg7335 [JRKSJ R1] 异或 题解
    本题的标签中含有trie,但是这道题可以不用trie做。考虑列出本题的dp方程:设\(f_{k,i}\)表示前\(i\)个数选了\(k\)段的答案,\(s_i\)为数组的前缀异或和当不选择第\(i\)位,使用......
  • 1487. 保证文件名唯一 (Medium)
    问题描述1487.保证文件名唯一(Medium)给你一个长度为n的字符串数组names。你将会在文件系统中创建n个文件夹:在第i分钟,新建名为names[i]的文件夹。由于两个......
  • trie 树 求最大异或和
    题目:给定一个非负整数数列a,初始长度为N。请在所有长度不超过M的连续子数组中,找出子数组异或和的最大值。子数组的异或和即为子数组中所有元素按位异或得到的结果。......