日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 900. RLE 迭代器(模拟/二分查找)

發布時間:2024/7/5 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 900. RLE 迭代器(模拟/二分查找) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 1. 題目
    • 2. 解題
      • 2.1 直接模擬
      • 2.2 二分查找

1. 題目

編寫一個遍歷游程編碼序列的迭代器。

迭代器由 RLEIterator(int[] A) 初始化,其中 A 是某個序列的游程編碼。
更具體地,對于所有偶數 i,A[i] 告訴我們在序列中重復非負整數值 A[i + 1] 的次數。

迭代器支持一個函數:next(int n),它耗盡接下來的 n 個元素(n >= 1)并返回以這種方式耗去的最后一個元素。
如果沒有剩余的元素可供耗盡,則 next 返回 -1 。

例如,我們以 A = [3,8,0,9,2,5] 開始,這是序列 [8,8,8,5,5] 的游程編碼。
這是因為該序列可以讀作 “三個八,零個九,兩個五”。

示例: 輸入:["RLEIterator","next","next","next","next"], [[[3,8,0,9,2,5]],[2],[1],[1],[2]] 輸出:[null,8,8,5,-1] 解釋: RLEIterator 由 RLEIterator([3,8,0,9,2,5]) 初始化。 這映射到序列 [8,8,8,5,5]。 然后調用 RLEIterator.next 4次。.next(2) 耗去序列的 2 個項,返回 8。現在剩下的序列是 [8, 5, 5].next(1) 耗去序列的 1 個項,返回 8。現在剩下的序列是 [5, 5].next(1) 耗去序列的 1 個項,返回 5。現在剩下的序列是 [5].next(2) 耗去序列的 2 個項,返回 -1。 這是由于第一個被耗去的項是 5, 但第二個項并不存在。由于最后一個要耗去的項不存在,我們返回 -1。提示: 0 <= A.length <= 1000 A.length 是偶數。 0 <= A[i] <= 10^9 每個測試用例最多調用 1000 次 RLEIterator.next(int n)。 每次調用 RLEIterator.next(int n) 都有 1 <= n <= 10^9

來源:力扣(LeetCode) 鏈接:https://leetcode-cn.com/problems/rle-iterator
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

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];//每個數字的個數arr[i/2] = A[i];//數字}}int next(int n) {val = -1;while(idx < count.size() && n > 0){if(count[idx] > n)//個數多{count[idx] -= n;//當前數字個數減去nreturn arr[idx];}else//個數不夠 或者 剛好{n -= count[idx];//還差幾個 n if(n == 0)val = arr[idx];idx++;//移動到下一個數}}return val;} };

12 ms 8.2 MB

2.2 二分查找

  • 記錄前綴和個數(非減序列),二分查找歷史第多少個(n也全部加起來)
class RLEIterator {vector<int> arr;vector<long long> count;long long totalcount = 0; public:RLEIterator(vector<int>& A) {for(int i = 1; i < A.size(); i += 2){if(A[i-1] == 0)//數量為0,跳過 continue;totalcount += A[i-1];//前綴個數count.push_back(totalcount);arr.push_back(A[i]);}totalcount = 0;//重置}int next(int n) {totalcount += n; // 二分查找大于等于 totalcount 的第一個元素int l = 0, r = arr.size()-1, mid;while(l <= r){mid = l+((r-l)>>1);if(count[mid] < totalcount)l = mid+1;else{if(mid == 0 || count[mid-1] < totalcount)return arr[mid];elser = mid-1;}}return -1;} };

16 ms 8.5 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關注我的公眾號(Michael阿明),一起加油、一起學習進步!

總結

以上是生活随笔為你收集整理的LeetCode 900. RLE 迭代器(模拟/二分查找)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。