RLE Iterator LT900
Write an iterator that iterates through a run-length encoded sequence.
The iterator is initialized by RLEIterator(int[] A), where A is a run-length encoding of some sequence. More specifically, for all even i, A[i] tells us the number of times that the non-negative integer value A[i+1] is repeated in the sequence.
The iterator supports one function: next(int n), which exhausts the next n elements (n >= 1) and returns the last element exhausted in this way. If there is no element left to exhaust, next returns -1 instead.
For example, we start with A = [3,8,0,9,2,5], which is a run-length encoding of the sequence [8,8,8,5,5]. This is because the sequence can be read as "three eights, zero nines, two fives".
Idea 1.a Bruteforce, using queue simulate the exhausting operation
class RLEIterator {
private Deque<Integer> buffer;
public RLEIterator(int[] A) {
buffer = new LinkedList<>();
for(int i = 1; i < A.length; i+=2) {
int cnt = A[i-1];
int value = A[i];
while(cnt > 0) {
buffer.offerLast(value);
--cnt;
}
}
}
public int next(int n) {
Integer value = null;
while(n > 0) {
value = buffer.pollFirst();
--n;
}
return value == null? -1: value;
}
}
Idea 1.b too much space and very slow to remove element one by one, the key is to find the index of last exhausted element, once we know the current index and remaining elements on the current index, we can get the result
A[currIndex+1] if remaining >= n
n -= remaining; remaining = A[currIndex + 2]; currIndex += 2, moving to the next element
Time complexity: O(N + Q), N = A.length, Q = number of calls to next()
Space complexity: O(N)
class RLEIterator {
private int remaining;
private int currIndex;
private int[] A;
public RLEIterator(int[] A) {
remaining = A[0];
currIndex = 0;
this.A = A;
}
public int next(int n) {
while(currIndex < A.length) {
if(remaining < n) {
n -= remaining;
currIndex += 2;
if(currIndex < A.length) {
remaining = A[currIndex];
}
}
else {
remaining -= n;
return A[currIndex+1];
}
}
return -1;
}
}
Idea 1.c instead of storing the remaining elements, storing the exhausted elements which represents that exhausted elements of A[currIndex+1] are exhausted, hence the next exhausted = 0 for next element, saving checking index to get A[currIndex] for the next remaining
Time complexity: O(N + Q)
Space complexity: O(N)
class RLEIterator {
private int exhausted;
private int currIndex;
private int[] A;
public RLEIterator(int[] A) {
exhausted = 0;
currIndex = 0;
this.A = A;
}
public int next(int n) {
while(currIndex < A.length) {
if(A[currIndex] - exhausted < n) {
n -= A[currIndex] - exhausted;
currIndex += 2;
exhausted = 0;
}
else {
exhausted += n;
return A[currIndex+1];
}
}
return -1;
}
}
Idea 1.d Modifying the Array
class RLEIterator {
private int currIndex;
private int[] A;
public RLEIterator(int[] A) {
currIndex = 0;
this.A = A;
}
public int next(int n) {
while(currIndex < A.length) {
if(A[currIndex] < n) {
n -= A[currIndex];
currIndex += 2;
}
else {
A[currIndex] -= n;
return A[currIndex+1];
}
}
return -1;
}
}
which style would you prefer?
class RLEIterator {
private int currIndex;
private int[] A;
public RLEIterator(int[] A) {
currIndex = 0;
this.A = A;
}
public int next(int n) {
while(currIndex < A.length && A[currIndex] < n) {
n -= A[currIndex];
currIndex += 2;
}
if(currIndex < A.length) {
A[currIndex] -= n;
return A[currIndex+1];
}
return -1;
}
}
Example 1:
Input: ["RLEIterator","next","next","next","next"], [[[3,8,0,9,2,5]],[2],[1],[1],[2]]
Output: [null,8,8,5,-1]
Explanation:
RLEIterator is initialized with RLEIterator([3,8,0,9,2,5]).
This maps to the sequence [8,8,8,5,5].
RLEIterator.next is then called 4 times: .next(2) exhausts 2 terms of the sequence, returning 8. The remaining sequence is now [8, 5, 5]. .next(1) exhausts 1 term of the sequence, returning 8. The remaining sequence is now [5, 5]. .next(1) exhausts 1 term of the sequence, returning 5. The remaining sequence is now [5]. .next(2) exhausts 2 terms, returning -1. This is because the first term exhausted was 5,
but the second term did not exist. Since the last term exhausted does not exist, we return -1.
Note:
0 <= A.length <= 1000A.lengthis an even integer.0 <= A[i] <= 10^9- There are at most
1000calls toRLEIterator.next(int n)per test case. - Each call to
RLEIterator.next(int n)will have1 <= n <= 10^9.
RLE Iterator LT900的更多相关文章
- LC 900. RLE Iterator
Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...
- [Swift]LeetCode900. RLE 迭代器 | RLE Iterator
Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...
- 900. RLE Iterator
Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...
- leetcode 900. RLE Iterator
Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...
- [LeetCode] 900. RLE Iterator RLE迭代器
Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...
- 【LeetCode】900. RLE Iterator 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/rle-itera ...
- 【leetcode】900. RLE Iterator
题目如下: 解题思路:非常简单的题目,直接递归就行了. 代码如下: class RLEIterator(object): def __init__(self, A): ""&quo ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
随机推荐
- 【转】JS前台加密,java后台解密实现
因项目需求,需要一些敏感信息进行加密,不能以明文暴露到浏览器. 然后后台进行解密操作 先看一下效果图 未对其加密传输 1.前台JS <script type="text/javascr ...
- js 数组删除元素,并获得真实长度
前言:js数组删除一般采用数组的 splice 方法和 delete 方法,但是采用 delete 方法后直接数组.kength 来获取数组长度是获取不了真实长度的,下面详细讲解一下. 一.splic ...
- MangoDB的C#驱动库(.net framewokr 4.0)
编写运维工具,需要联接MangoDB 基于我陈旧的技术栈,就用c#开发了 驱动库下载地址记录到至此,需要的可以下载 注意,此驱动是老版本的,只支持.net framewokr 4.0 看了半天,觉得够 ...
- NOIP2017 题解
QAQ--由于没报上名并没能亲自去,自己切一切题聊以慰藉吧-- 可能等到省选的时候我就没有能力再不看题解自己切省选题了--辣鸡HZ毁我青春 D1T1 小凯的疑惑 地球人都会做,懒得写题解了-- D1T ...
- 如何去掉iview里面的input,button等一系列标签自带的蓝色边框
只需要将这些标签加一个:focus{outline:0}即可解决这个问题
- js时间与毫秒数互相转换(转)
[1]js毫秒时间转换成日期时间 var oldTime = (new Date("2017/04/25 19:44:11")).getTime(); //得到毫秒数 / ...
- 浏览器根对象window之事件
1. [事件]动画 onanimationstart onanimationend onanimationiteration onwebkitanimationend onwebkitanimatio ...
- 网件路由器wps无法设置
问题:网件路由器WPS设置项全为灰色,无没设置 原因:因为设置WIFI时,将ssid广播隐藏了,导致WPS功能失效,所以WPS设置项为灰色.要想设置WPS,将SSID广播恢复即可
- Android批量打包提速 - 1分钟900个市场不是梦
版权声明: 欢迎转载,但请保留文章原始出处 作者:GavinCT 出处:http://www.cnblogs.com/ct2011/p/4152323.html 黎明前的黑暗 使用Ant或者Gradl ...
- 1.Spring——七大主要模块
Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Content. 下面分别简单介绍: 1.Spring Core Core模块是Spring的核心类库 ...