♒成雙成對 子陣列的XOR query_XOR Queries of a Subarray_Leetcode #1310

閱讀時間約 1 分鐘

題目敘述 1310. XOR Queries of a Subarray

給定一個整數陣列arr,和一串區間XOR請求queries。

請計算queries所請求的區間XOR值,並且以陣列的形式返回答案。


測試範例

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]

約束條件

Constraints:

  • 1 <= arr.length, queries.length <= 3 * 10^4

arr陣列 和 queries陣列長度都介於1~三萬之間。

  • 1 <= arr[i] <= 10^9

每個陣列元素都介於1~十億之間。

  • queries[i].length == 2

每個query標明 起點索引 和 終點索引。

  • 0 <= lefti <= righti < arr.length

0 < 起點 <= 終點 < arr陣列長度


演算法 利用XOR性質 和 前綴和觀念


XOR運算有一個很好的性質,同樣的變數XOR兩次會成雙成對消去=0。

A XOR A = 0


接著,再借用前綴和的觀念,建立一個prefix XOR table。

arr[0] ⊕ arr[1] ⊕ ... arr[起點-1]

⊕ arr[0] ⊕ arr[1] ⊕ ... arr[起點-1] ⊕ arr[起點] ⊕ ... ⊕ arr[終點]

= arr[起點] ⊕ ... ⊕ arr[終點]

= 題目query所求


程式碼 利用XOR性質 和 前綴和觀念

# XOR property review:
'''
Associativity:
(A XOR B) XOR C = A XOR (B XOR C)

Commutativity:
A XOR B = B XOR A

Idempotency:
A XOR A = 0
'''

class Solution:
def xorQueries(self, arr: List[int], queries: List[List[int]]) -> List[int]:

result, size = [], len(arr)

look_up_table = [0] * ( size+1 )

# table[i] = arr[0] XOR arr[1] XOR ... XOR arr[i-1]
for i in range(size):
look_up_table[i+1] = look_up_table[i] ^ arr[i]

# compute query, q, by look-up table as well as XOR property
'''
Left = ( prefix leading temrs )
Right = ( prefix leading temrs ) XOR arr[ q[0] ] XOR ... XOR arr[ q[1] ]

Left XOR Right = arr[ q[0] ] XOR ... XOR arr[ q[1] ]
'''
for q in queries:
left = look_up_table[ q[0] ]
right = look_up_table[ q[1] + 1 ]
result.append( left ^ right )

return result

複雜度分析

時間複雜度: O(n + q)

O(n)時間建立prefix XOR table

O(q)計算每一條區間XOR計算請求。


空間複雜度: O(n)

需要O(n)空間來建立prefix XOR table。


Reference

[1] XOR Queries of a Subarray - LeetCode

80會員
417內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
Path with Maximum Probability 題目給定一個無向圖(雙向移動皆可), 提供每條邊的起終點,和每條邊對應的通過時的成功機率。 請問從起點start走到終點end的最高成功機率是多少? 如果完全沒有路徑可以抵達,則返回0。
題目敘述 664. Strange Printer 有一台奇怪的印表機, 每次操作只能連續印同樣的字母,但是列印的長度可以自由控制。 而且,印刷的時候,可以蓋過去舊的字元。 (這邊當然不合常理,讀者可以理解成塗了立可帶再蓋過去的情境) 給定一個輸入字串s,請問最少需要幾次操作,才能印出字串s?
題目敘述 1406. Stone Game III Alice 和 Bob 輪流玩取石頭的遊戲。 輸入陣列stoneValue 代表每顆石頭對應的價值。 規則如下: 每個人每回合可以從剩餘的石頭,從前面拿一顆、兩顆、或三顆石頭。 兩個人輪流交替拿。Alice先手,第一回合Alice
題目敘述 Leetcode: 650. 2 Keys Keyboard 一開始初始化的時候,記事本上只有一個字元'A'。 只允許下列兩種操作 複製目前記事本上的整個字串。 貼上之前複製的內容,串接在尾端。 請問,最少需要幾個操作, 才能製造出內容都是 "AAA...A",長度為n的字串?
題目敘述: 264. Ugly Number II 定義Ugly number序列是質因數只有2, 3, 5的正整數數列。 也就是說 x = 2^i * 3^j * 5^k, where i >= 0, j >= 0, k >= 0 請計算第n項的Ugly number 等於多少?
給定木板的長度和切割點位置,找到最小總切割成本。透過DP動態規劃和區間DP框架,定義DP狀態並推導出最小切割成本的遞迴關係式。複雜度分析為時間複雜度O(n^3)和空間複雜度O(n^2)。關鍵知識點在於挖掘切割問條的共通模式,透過範例和圖解輔助思考。
Path with Maximum Probability 題目給定一個無向圖(雙向移動皆可), 提供每條邊的起終點,和每條邊對應的通過時的成功機率。 請問從起點start走到終點end的最高成功機率是多少? 如果完全沒有路徑可以抵達,則返回0。
題目敘述 664. Strange Printer 有一台奇怪的印表機, 每次操作只能連續印同樣的字母,但是列印的長度可以自由控制。 而且,印刷的時候,可以蓋過去舊的字元。 (這邊當然不合常理,讀者可以理解成塗了立可帶再蓋過去的情境) 給定一個輸入字串s,請問最少需要幾次操作,才能印出字串s?
題目敘述 1406. Stone Game III Alice 和 Bob 輪流玩取石頭的遊戲。 輸入陣列stoneValue 代表每顆石頭對應的價值。 規則如下: 每個人每回合可以從剩餘的石頭,從前面拿一顆、兩顆、或三顆石頭。 兩個人輪流交替拿。Alice先手,第一回合Alice
題目敘述 Leetcode: 650. 2 Keys Keyboard 一開始初始化的時候,記事本上只有一個字元'A'。 只允許下列兩種操作 複製目前記事本上的整個字串。 貼上之前複製的內容,串接在尾端。 請問,最少需要幾個操作, 才能製造出內容都是 "AAA...A",長度為n的字串?
題目敘述: 264. Ugly Number II 定義Ugly number序列是質因數只有2, 3, 5的正整數數列。 也就是說 x = 2^i * 3^j * 5^k, where i >= 0, j >= 0, k >= 0 請計算第n項的Ugly number 等於多少?
給定木板的長度和切割點位置,找到最小總切割成本。透過DP動態規劃和區間DP框架,定義DP狀態並推導出最小切割成本的遞迴關係式。複雜度分析為時間複雜度O(n^3)和空間複雜度O(n^2)。關鍵知識點在於挖掘切割問條的共通模式,透過範例和圖解輔助思考。
你可能也想看
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
Thumbnail
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
題目敘述 Intersection of Two Arrays II 給定兩個輸入陣列,請找出兩個陣列交集的元素,並且依照出現次數輸出。 測試範例 Example 1: Input: nums1 = [1,2,2,1], nums2 = [2,2] Output: [2,2] 交集元素
Thumbnail
題目敘述 Subarray Sums Divisible by K 給定一個整數陣列,請計算有幾個區間和能夠整除k的連續區間? 測試範例 Input: nums = [4,5,0,-2,-3,1], k = 5 Output: 7
Thumbnail
Continuous Subarray Sum 給定一個整數陣列,請問是否存在一段區間和能夠整除k的連續區間,而且區間長度≥2? 如果存在,返回True。 無果無解,返回False。 例如[2,5,3,1,8,6], k = 6, 其中[3,1,8]是區間和能夠整除6的連續區間,而且區間長度≥2
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,和一個指定的k值。 請問,在輸入陣列nums中,有幾個子陣列的元素總合恰好為k ? 例如: nums = [1,2,3], k = 3 則有兩個子陣列的元素總合為3,分別是[1,2] 和 [3] 如果是第一次聽到或接觸前綴和prefix的同學
Thumbnail
題目敘述 題目會給定一個整數陣列arr,要求我們判斷是否每個元素的出現次數都不同? 題目的原文敘述 測試範例 Example 1: Input: arr = [1,2,2,1,1,3] Output: true Explanation: The value 1 has 3 occurre
Thumbnail
1.加權指數與櫃買指數 週五的加權指數在非農就業數據開出來後,雖稍微低於預期,但指數仍向上噴出,在美股開盤後於21500形成一個爆量假突破後急轉直下,就一路收至最低。 台股方面走勢需觀察週一在斷頭潮出現後,週二或週三開始有無買單進場支撐,在沒有明確的反轉訊號形成前,小夥伴盡量不要貿然抄底,或是追空
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
題目敘述 Combination Sum II_Leetcode #40 給定一個整數陣列candidates 和 目標值target。 每個陣列元素只能選擇一次,請問有多少種組合方法,可以使得組合數總和 = target? 請把滿足組合數總和 = target的組合方法以陣列的形式返回答案
Thumbnail
題目敘述 Make Two Arrays Equal by Reversing Subarrays 題目給定兩個輸入陣列,請問能否透過子陣列的反轉讓兩個陣列相等? 子陣列的反轉操作次數不受限制。 如果可以,返回True 如果不行,返回False
Thumbnail
給定一個輸入陣列,每一個tuple代表節點之間了從屬關係。 請從從屬關係重建整顆二元樹,並且返回整顆二元樹的根結點。
Thumbnail
題目敘述 Merge Nodes in Between Zeros 給定一個鏈結串列,合併非零區間的節點(以加總的方式合併),輸出合併後的鏈結串列。
Thumbnail
題目敘述 Intersection of Two Arrays II 給定兩個輸入陣列,請找出兩個陣列交集的元素,並且依照出現次數輸出。 測試範例 Example 1: Input: nums1 = [1,2,2,1], nums2 = [2,2] Output: [2,2] 交集元素
Thumbnail
題目敘述 Subarray Sums Divisible by K 給定一個整數陣列,請計算有幾個區間和能夠整除k的連續區間? 測試範例 Input: nums = [4,5,0,-2,-3,1], k = 5 Output: 7
Thumbnail
Continuous Subarray Sum 給定一個整數陣列,請問是否存在一段區間和能夠整除k的連續區間,而且區間長度≥2? 如果存在,返回True。 無果無解,返回False。 例如[2,5,3,1,8,6], k = 6, 其中[3,1,8]是區間和能夠整除6的連續區間,而且區間長度≥2
Thumbnail
題目敘述 題目會給我們一個輸入陣列nums,和一個指定的k值。 請問,在輸入陣列nums中,有幾個子陣列的元素總合恰好為k ? 例如: nums = [1,2,3], k = 3 則有兩個子陣列的元素總合為3,分別是[1,2] 和 [3] 如果是第一次聽到或接觸前綴和prefix的同學
Thumbnail
題目敘述 題目會給定一個整數陣列arr,要求我們判斷是否每個元素的出現次數都不同? 題目的原文敘述 測試範例 Example 1: Input: arr = [1,2,2,1,1,3] Output: true Explanation: The value 1 has 3 occurre