文章目录

  • 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 迭代器(模拟/二分查找)相关推荐

  1. 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)

    LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...

  2. LeetCode算法题4:二分查找及扩展应用

    文章目录 前言 一.二分查找 二.第一个错误的版本 三.搜索插入位置 总结 前言 Leetcode算法系列:https://leetcode-cn.com/study-plan/algorithms/ ...

  3. LeetCode 1891. 割绳子(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个整数数组 ribbons 和一个整数 k,数组每项 ribbons[i] 表示第 i 条绳子的长度. 对于每条绳子,你可以将任意切割成一系列长度为 ...

  4. LeetCode 911. 在线选举(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 在选举中,第 i 张票是在时间为 times[i] 时投给 persons[i] 的. 现在,我们想要实现下面的查询函数: TopVotedCandida ...

  5. LeetCode 162. 寻找峰值(二分查找)

    1. 题目 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返回任何一 ...

  6. LeetCode 35. 搜索插入位置(二分查找)

    文章目录 1. 题目信息 2. 解题 2.1 暴力遍历 2.2 二分查找 1. 题目信息 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插 ...

  7. LeetCode #69 x的平方根 二分查找

    LeetCode #69 x的平方根 题目描述 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍 ...

  8. [LeetCode] Serch Insert Position (总结二分查找) Java version

    原题地址:https://oj.leetcode.com/problems/search-insert-position/: 查找插入口,在使用二分查找发的时候需要注意,与以前不同.在没有找到与tar ...

  9. LeetCode面试刷题技巧-二分查找算法代码思路解析

    二分查找的思想 提及二分查找算法,我想大部分人都不陌生,就算不是学计算机的,基本上也都使用过二分查找的思想,不信的话,且听我慢慢为你道来. 不知道你有没有玩过这样一个游戏,猜数字.就是说一个人心里想了 ...

最新文章

  1. FreeMarker对应各种数据结构解析
  2. 对所写博客的几点说明
  3. php redis 投票_高可用Redis服务架构分析与搭建
  4. 我给Apache顶级项目提了个Bug
  5. (android 源码下开发应用程序) 如何在 Android 各 level ( 包含 user space 與 kernel space ) 使用dump call stack的方法...
  6. perl脚本中的特殊字符也与V字符串
  7. 算法知识点——(2)模型评估
  8. cad2012打开后闪退_win10系统安装cad2012一直闪退的解决方法
  9. 计算机高手如何操作键盘,从小白到高手 游戏键盘驱动全面解析
  10. 阿里云 ECS windows服务器创建+部署+域名
  11. 从底特律的覆灭,反思“珠三角”未来
  12. Notification-通知
  13. C++关于利用_kbhit()函数持续获取键盘输入的一点心得。
  14. 方孔分段的lisp_cad怎么把一条线直接分段
  15. 中国单反数码相机市场现状动态及前景规模调查报告2022-2028年版
  16. day19TreeSet类
  17. SqlYog创建数据库
  18. Java生成树型结构
  19. Java基础 - 坦克大战(第三章,线程基础与线程使用)
  20. layout_align layout_center layout_margin属性

热门文章

  1. 友善串口工具接收数据随机换行_使用Python3+PyQT5+Pyserial 实现简单的串口工具方法...
  2. 【SSL】HTTPS配置全过程
  3. Python3.6+Django2.0+Xadmin2.0学生信息管理系统-2
  4. 计算机统考分数短信显示合格,今年起全省八年级网考信息技术 成绩不合格不能升高中...
  5. Linux下WPS自主设置快捷键,电脑wps的word怎么自主设定快捷键
  6. nanotime java 博客园_System.nanoTime (计时工具类)
  7. 《鸟哥的Linux基础》
  8. C#基于LibUsbDotNet实现USB通信(一)
  9. Oracle Minus关键字
  10. Mysql中常用的函数汇总