題目描述: 給定一個整數陣列 arr,實作一個資料結構,支援查詢:在子陣列 arr[left..right] 中,值 value 出現了幾次。
解題思路: 使用 hash map + 二分搜尋。
這利用了索引列表已排序的特性,二分搜尋在 O(log n) 時間內完成查詢。
時間複雜度:建構子 O(n),每次查詢 O(log n) — 二分搜尋索引列表。
空間複雜度:O(n) — 儲存所有元素的索引位置。
1. BUILD: For each index i, append i to positions[arr[i]]. 2. QUERY(left, right, value): a. If value not in positions, return 0. b. In positions[value], binary search for first index >= left → lo. c. Binary search for first index > right → hi. d. Return hi - lo.
線段樹 + 離散化:對每個區間節點維護一個值到頻率的映射。可以支援區間修改,但查詢和建構都較複雜,空間 O(n log n)。
分塊(Sqrt Decomposition):將陣列分成大小 √n 的塊,每塊維護值頻率的映射。查詢時兩端部分暴力、中間整塊查表。建構 O(n),查詢 O(√n),介於暴力和二分搜尋之間。