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 iA[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:

  1. 0 <= A.length <= 1000
  2. A.length is an even integer.
  3. 0 <= A[i] <= 10^9
  4. There are at most 1000 calls to RLEIterator.next(int n) per test case.
  5. Each call to RLEIterator.next(int n) will have 1 <= n <= 10^9.

RLE Iterator LT900的更多相关文章

  1. LC 900. RLE Iterator

    Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...

  2. [Swift]LeetCode900. RLE 迭代器 | RLE Iterator

    Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...

  3. 900. RLE Iterator

    Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...

  4. leetcode 900. RLE Iterator

    Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...

  5. [LeetCode] 900. RLE Iterator RLE迭代器

    Write an iterator that iterates through a run-length encoded sequence. The iterator is initialized b ...

  6. 【LeetCode】900. RLE Iterator 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/rle-itera ...

  7. 【leetcode】900. RLE Iterator

    题目如下: 解题思路:非常简单的题目,直接递归就行了. 代码如下: class RLEIterator(object): def __init__(self, A): ""&quo ...

  8. Swift LeetCode 目录 | Catalog

    请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift    说明:题目中含有$符号则为付费题目. 如 ...

  9. All LeetCode Questions List 题目汇总

    All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...

随机推荐

  1. 比较ArrayList和LinkedList的异同

    1.ArrayList是实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构: 2.对于随机访问get和set,ArrayList要优于LinkedList; 3.对于添加和删除操 ...

  2. MQ疑难杂症小记

    为什么使用消息队列? 什么业务场景,这个业务场景有个什么技术挑战,如果不用MQ可能会很麻烦,但是你现在用了MQ之后带给了你很多的好处.消息队列的常见使用场景,其实场景有很多,但是比较核心的有3个:解耦 ...

  3. 解决Coursera平台上Andrew.Ng的机器学习课程无法正常提交编程作业的问题

    课程链接:https://www.coursera.org/learn/machine-learning/home/welcome 我使用的环境是MATLAB R2016a,Win10系统. 执行su ...

  4. 计算机网络:自顶向下方法(第七版)Wireshark实验指南

    这本书的每一章后面都提供了一个Wireshark实验,通过使用Wireshark抓包并手动对包进行分析可以帮助我们更好地理解各种协议和相关知识.然而,这个资源在网上好像很难找,我历经千辛万苦找到之后, ...

  5. gRPC版本的 Google APIs

    gRPC将是未来google所有客户端的库标准(DevoxxFR), 这句话的出处: https://twitter.com/chanezon/status/585724143003402240    ...

  6. Java的工厂模式(一)

    Java的工厂模式在框架中是用的到很多的,所谓的工厂模式,其实也就是用一个接口来创建对象,把实例化的工作推迟到子类去实现.这样在主函数中就可以直接创建一个工厂类,再通过这个工厂类实现操作. 假设有一个 ...

  7. java设计模式-----13、组合模式

    Composite模式也叫组合模式,是构造型的设计模式之一.通过递归手段来构造树形的对象结构,并可以通过一个对象来访问整个对象树. 组合(Composite)模式的其它翻译名称也很多,比如合成模式.树 ...

  8. vs2017 + Python3.6 +Django1.11 连接mysql数据库

    不废话直接来. vs2017创建一个新的python web项目之后默认链接数据库是sqlite.但是我就想连接到Mysql 上面玩,于是开始倒腾了.下面是步骤 1.修改settings.py 文件需 ...

  9. WPF tooltip 根据父元素属性决定是否显示

    例如:Placement为disable的时候,需要显示一段tooltip, 而当Placement为enable的时候,不显示 <Button Grid.Row="2" x ...

  10. [SQLServer] 数据库SA用户被锁定或者忘记密码的恢复

    一.以管理员权限运行命令提示符 CMD C:\>net stop mssqlserver您想继续此操作吗? (Y/N) [N]: y C:\>net start mssqlserver / ...