ETH官方钱包

前往
大廳
主題

LeetCode - 2526. Find Consecutive Integers from a Data Stream 解題心得

Not In My Back Yard | 2023-11-28 12:00:50 | 巴幣 0 | 人氣 97

題目連結(jié):


題目意譯:
對於一個(gè)整數(shù)串流,實(shí)作一個(gè)資料結(jié)構(gòu)來檢查串流中最近 k 個(gè)被處理過的整數(shù)是否都是等於 value。

實(shí)作類別 DataStream:
DataStream(int value, int k) 初始化一個(gè)有著空的整數(shù)串流以及兩個(gè)整數(shù) value 和 k 之物件。
boolean consec(int num) 將 num 加進(jìn)整數(shù)串流中。如果最近 k 個(gè)整數(shù)值都是 value,則回傳真(True);反之,則回傳假(False)。如果當(dāng)前串流中少於 k 個(gè)整數(shù),因?yàn)椴粷M足條件,所以回傳假。

限制:
1 ≦ value, num ≦ 10 ^ 9
1 ≦ k ≦ 10 ^ 5
最多呼叫 consec 10 ^ 5 次。



範(fàn)例測資:
範(fàn)例 1:
輸入
["DataStream", "consec", "consec", "consec", "consec"]
[[4, 3], [4], [4], [4], [3]]
輸出
[null, false, false, true, false]
解釋
DataStream dataStream = new DataStream(4, 3); //value = 4, k = 3
dataStream.consec(4); // 只有 1 個(gè)整數(shù)被處理過,所以回傳假。
dataStream.consec(4); // 只有 2 個(gè)整數(shù)被處理過。
                      // 由於 2 小於 3,所以回傳假。
dataStream.consec(4); // 3 個(gè)整數(shù)被處理過了且全部都等於 value,因此回傳真。
dataStream.consec(3); // 在串流中最近被處理的 k 個(gè)整數(shù)為 [4,4,3]。
                      // 由於 3 不等於 value,所以回傳假。


解題思維:
基本上就是滑動(dòng)視窗(Sliding Window)的題型,如這題

利用一個(gè)佇列(Queue)來儲(chǔ)存最近 k 個(gè)(只有一開始會(huì)不滿 k 個(gè))整數(shù)依序?yàn)楹危瑏K用一個(gè)變數(shù) C 來記錄當(dāng)中有多少數(shù)字等於 value。

接著每當(dāng)有新的整數(shù)進(jìn)來時(shí),如果該佇列大小超過 k 則把最久遠(yuǎn)的整數(shù)移除(如果不滿 k 個(gè)數(shù),則跳過移除的步驟到下一個(gè)),而當(dāng)被移除的整數(shù)是 value 時(shí),將 C 減去 1;反之則不變。再來把新進(jìn)的整數(shù)丟進(jìn)佇列中並根據(jù)其值決定要不要把 C 加上 1。

此時(shí)如果 C 恰好等於 k,則回傳真;反之,則回傳假。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創(chuàng)作回應(yīng)

更多創(chuàng)作