题目大意:
子数组异或查询
有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。
对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] xor arr[Li+1] xor … xor arr[Ri])作为本次查询的结果。
并返回一个包含给定查询 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
如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1310
解题思路分析:
这道题第一反应让我想到了前缀和数组。假如本题求的不是区间内的亦或值(xor),而是求区间内和的话,我们应该想到使用前缀和数组presum[]方式解题,先遍历一遍数组,求出所有区间[0, i](i>=0, i<arr.length)的区间和,然后对于任意区间[x, y]的和应该等于presum[y]-presum[x-1]。
同理,本题是亦或版本的前缀区间问题,先定义一个前缀亦或数组pre[],遍历一遍数组,求出所有区间[0, i](i>=0, i<arr.length)的亦或值,然后对于任意区间[x, y]的亦或值应该等于presum[y]^presum[x-1]。
实现代码:
public int[] xorQueries(int[] arr, int[][] queries) { int[] pre = new int[arr.length]; // 前缀亦或数组 pre[0]=arr[0]; // 求前缀亦或数组 for(int i=1;i<arr.length;i++){ pre[i] = (pre[i-1]^arr[i]); } // 返回结果 int[] res = new int[queries.length]; // 循环每一个区间 for(int i=0;i<queries.length;i++){ // 当前区间 int[] q=queries[i]; // 如果左区间为0,直接返回对应的前缀数组的值 if(q[0]==0){ res[i]=pre[q[1]]; }else{ // 反之通过前缀数组求解 res[i]=pre[q[1]]^pre[q[0]-1]; } } return res; }
本题解法执行时间为1ms。
Runtime: 1 ms, faster than 100.00% of Java online submissions for XOR Queries of a Subarray.
Memory Usage: 55.7 MB, less than 100.00% of Java online submissions for XOR Queries of a Subarray.
本网站文章均为原创内容,并可随意转载,但请标明本文链接如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: https://leetcode.jp/leetcode-1310-xor-queries-of-a-subarray-解题思路分析/
Pingback引用通告: LEETCODE 1442. Count Triplets That Can Form Two Arrays of Equal XOR 解题思路分析 - LEETCODE从零刷LEETCODE从零刷