LeetCode 900. RLE 迭代器(模拟/二分查找)
文章目錄
- 1. 題目
- 2. 解題
- 2.1 直接模擬
- 2.2 二分查找
1. 題目
編寫(xiě)一個(gè)遍歷游程編碼序列的迭代器。
迭代器由 RLEIterator(int[] A) 初始化,其中 A 是某個(gè)序列的游程編碼。
更具體地,對(duì)于所有偶數(shù) i,A[i] 告訴我們?cè)谛蛄兄兄貜?fù)非負(fù)整數(shù)值 A[i + 1] 的次數(shù)。
迭代器支持一個(gè)函數(shù):next(int n),它耗盡接下來(lái)的 n 個(gè)元素(n >= 1)并返回以這種方式耗去的最后一個(gè)元素。
如果沒(méi)有剩余的元素可供耗盡,則 next 返回 -1 。
例如,我們以 A = [3,8,0,9,2,5] 開(kāi)始,這是序列 [8,8,8,5,5] 的游程編碼。
這是因?yàn)樵撔蛄锌梢宰x作 “三個(gè)八,零個(gè)九,兩個(gè)五”。
來(lái)源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/rle-iterator
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。
2. 解題
2.1 直接模擬
class RLEIterator {vector<int> arr;vector<int> count;int idx = 0;int val; public:RLEIterator(vector<int>& A) {int n = A.size();arr.resize(n/2);count.resize(n/2);for(int i = 1; i < A.size(); i += 2){count[i/2] = A[i-1];//每個(gè)數(shù)字的個(gè)數(shù)arr[i/2] = A[i];//數(shù)字}}int next(int n) {val = -1;while(idx < count.size() && n > 0){if(count[idx] > n)//個(gè)數(shù)多{count[idx] -= n;//當(dāng)前數(shù)字個(gè)數(shù)減去nreturn arr[idx];}else//個(gè)數(shù)不夠 或者 剛好{n -= count[idx];//還差幾個(gè) n if(n == 0)val = arr[idx];idx++;//移動(dòng)到下一個(gè)數(shù)}}return val;} };12 ms 8.2 MB
2.2 二分查找
- 記錄前綴和個(gè)數(shù)(非減序列),二分查找歷史第多少個(gè)(n也全部加起來(lái))
16 ms 8.5 MB
我的CSDN博客地址 https://michael.blog.csdn.net/
長(zhǎng)按或掃碼關(guān)注我的公眾號(hào)(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!
總結(jié)
以上是生活随笔為你收集整理的LeetCode 900. RLE 迭代器(模拟/二分查找)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 02.改善深层神经网络:超参数调试、正则
- 下一篇: LeetCode 552. 学生出勤记录