leetcode 1310. XOR Queries of a Subarray(python)

1,084 阅读2分钟

本文已参与「掘力星计划」,赢取创作大礼包,挑战创作激励金

描述

Given the array arr of positive integers and the array queries where queries[i] = [Li, Ri], for each query i compute the XOR of elements from Li to Ri (that is, arr[Li] xor arr[Li+1] xor ... xor arr[Ri] ). Return an array containing the result for the given queries.

Example 1:

Input: arr = [1,3,4,8], queries = [[0,1],[1,2],[0,3],[3,3]]
Output: [2,7,14,8] 
Explanation: 
The binary representation of the elements in the array are:
1 = 0001 
3 = 0011 
4 = 0100 
8 = 1000 
The XOR values for queries are:
[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

Example 2:

Input: arr = [4,8,2,10], queries = [[2,3],[1,3],[0,0],[0,3]]
Output: [8,0,4,4]

Note:

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

解析

根据题意,就是给出了一个正整数列表 arr ,然后给出了查找索引范围列表 queries ,将每个索引查找范围内的 arr 元素都进行异或运算将结果加入到 reault 中并返回 result 。思路比较简单:

  • 初始化结果列表 result
  • 就是直接对 queries 进行遍历
  • 将 [Li, Ri] 范围内的 arr 元素进行 ^ 运算,并将结果加入 result
  • 遍历结束返回 result

从结果可以看出来超时了...啊哈,我就说这么简单的题肯定不是 Medium 难度的尿性。主要还是题目中给出的条件要求比较高,arr 和 queries 的长度都是 10^4 量级的,这谁顶得住,直接遍历肯定是超时了。

解答

class Solution(object):
    def xorQueries(self, arr, queries):
        """
        :type arr: List[int]
        :type queries: List[List[int]]
        :rtype: List[int]
        """
        result = []
        for query in queries:
            tmp = arr[query[0]]
            for i in range(query[0]+1, query[1]+1):
                tmp ^= arr[i]
            result.append(tmp)
        return result

        	      
		

运行结果

Time Limit Exceeded

解析

从题目的条件限制可以看出来,不管是 arr 的长度、还是 arr 中的元素、queries 的长度都是相当的大,所以直接像上面进行位运算肯定超时。

其实用到的原理还是 ^ 运算,但是这里有个小技巧,举个例子:

  • 假如 arr = [1,2,3]
  • 计算后两个元素的异或结果 2^3=1
  • 但是我计算了 arr 前三个元素的异或结果,然后对第一个元素再做异或,即 (1^2^3)^1 也可以得到上面的结果

所以推广这个做法,我们求 query=[L,R] 范围内的结果,可以先求出 [0,L-1] 所有元素的异或得到 a ,再求出 [0,R] 所有元素的异或 b ,然后 a^b 即可得到题目要求的答案,这个一方面是考察 ^ 运算,另一方面也是算一道找规律的题,深入思考一下就会想到了。

解答

class Solution(object):
    def xorQueries(self, arr, queries):
        """
        :type arr: List[int]
        :type queries: List[List[int]]
        :rtype: List[int]
        """
        A = [0]
        for a in arr:
            A.append(A[-1] ^ a)
        A.append(0)
        result = []
        for L, R in queries:
            result.append(A[L]^A[R+1])
        return result
        

运行结果

Runtime: 361 ms, faster than 31.82% of Python online submissions for XOR Queries of a Subarray.
Memory Usage: 28.6 MB, less than 11.36% of Python online submissions for XOR Queries of a Subarray.

原题链接:leetcode.com/problems/xo…

您的支持是我最大的动力