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 ...
随机推荐
- [日常] 搭建golang开发环境
下载目录:https://studygolang.com/dl32位选 go1.10.linux-386.tar.gz64位选 go1.10.linux-amd64.tar.gz uname -a查看 ...
- Xcode 8 媒体权限
- 为什么要用 C# 来作为您的首选编程语言
因为您可以用,并且也是您的最佳选择!之所以可用,是因为 C# 能够很好地在 Mac.Linux.Android 和 iOS 上运行(对了,还有 Windows):它可以在您最喜爱的编辑器上运行:它在一 ...
- Yii中文乱码 解决
需要将config/main.php改成utf-8编码即可
- android studio 加载libs
eclipse 项目转 android studio libs 不能加载 导致不能导入 记录下:libs 放在和src 同路径 dependencies:增加 compile files('libs ...
- 记录一次测试环境遇到的push消息记录
测试环境测试push消息,调用消息中心同事的api接口,感觉怎么都调用不通.纠结了一天,最终发现原因:一是版本的问题,不同的测试包有不同的版本,不同的版本 可能push的消息不同.二是 用户有没有 开 ...
- JVM知识(二):类加载器原理
我们知道我们编写的java代码,会经过编译器编译成字节码(class文件),再把字节码文件装载到JVM中,最后映射到各个内存区域中,我们的程序就可以在内存中运行了.那么问题来了,这些字节码文件是怎么装 ...
- null的专栏:https://blog.csdn.net/google19890102
null的专栏:https://blog.csdn.net/google19890102 csdn博客专栏:https://blog.csdn.net/column.html
- jquery validation表单验证插件2。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- Oracle EBS 获取公司段的本位币
SELECT gls.currency_code FROM hr_organization_information_v t, gl_sets_of_books gls WHERE t.org_info ...