政府網(wǎng)站頁面布局seo教育
題目描述:
請(qǐng)你設(shè)計(jì)一個(gè)數(shù)據(jù)結(jié)構(gòu),它能求出給定子數(shù)組內(nèi)一個(gè)給定值的?頻率?。
子數(shù)組中一個(gè)值的?頻率?指的是這個(gè)子數(shù)組中這個(gè)值的出現(xiàn)次數(shù)。
請(qǐng)你實(shí)現(xiàn)?RangeFreqQuery
?類:
RangeFreqQuery(int[] arr)
?用下標(biāo)從?0?開始的整數(shù)數(shù)組?arr
?構(gòu)造一個(gè)類的實(shí)例。int query(int left, int right, int value)
?返回子數(shù)組?arr[left...right]
?中?value
?的?頻率?。
一個(gè)?子數(shù)組?指的是數(shù)組中一段連續(xù)的元素。arr[left...right]
?指的是?nums
?中包含下標(biāo)?left
?和?right
?在內(nèi)?的中間一段連續(xù)元素。?
?代碼思路:
類初始化?__init__
?方法
- 輸入?yún)?shù):接收一個(gè)整數(shù)列表?
arr
。 - 數(shù)據(jù)結(jié)構(gòu):使用?
defaultdict(list)
?來存儲(chǔ)每個(gè)值在數(shù)組?arr
?中出現(xiàn)的所有索引。defaultdict
?是 Python?collections
?模塊中的一個(gè)容器,它允許我們通過默認(rèn)工廠函數(shù)(這里是?list
)來自動(dòng)初始化缺失的鍵。 - 填充字典:遍歷數(shù)組?
arr
,對(duì)于每個(gè)元素?v
?和其索引?i
,將索引?i
?添加到字典?dct
?中鍵?v
?對(duì)應(yīng)的列表中。這樣,dct[value]
?將會(huì)是一個(gè)列表,包含所有值為?value
?的元素的索引。
查詢方法?query
- 輸入?yún)?shù):接收三個(gè)整數(shù)?
left
、right
?和?value
,分別表示查詢的左邊界、右邊界和要查詢的值。 - 查詢邏輯:
- 使用?
bisect.bisect_left
?函數(shù)在?dct[value]
?列表中查找第一個(gè)大于或等于?left
?的索引的位置。這個(gè)位置之前的所有索引都不在查詢區(qū)間?[left, right]
?內(nèi)。 - 使用?
bisect.bisect_right
?函數(shù)在?dct[value]
?列表中查找第一個(gè)大于?right
?的索引的位置。這個(gè)位置之前的所有索引(不包括這個(gè)位置本身)都在查詢區(qū)間?[left, right]
?內(nèi)。 - 計(jì)算這兩個(gè)位置之間的差值,即?
bisect_right
?返回的位置減去?bisect_left
?返回的位置。這個(gè)差值就是值?value
?在區(qū)間?[left, right]
?內(nèi)出現(xiàn)的次數(shù)。
- 使用?
代碼實(shí)現(xiàn):
class RangeFreqQuery:def __init__(self, arr: List[int]):self.dct = defaultdict(list)for i, v in enumerate(arr): self.dct[v].append(i)def query(self, left: int, right: int, value: int) -> int:return bisect.bisect_right(self.dct[value], right) - bisect.bisect_left(self.dct[value], left)