RLE 迭代器
难度:
标签:
题目描述
代码结果
运行时间: 27 ms, 内存: 16.7 MB
/*
* 思路:
* 使用 Stream API 的话,我们可以用流式操作来实现类的构造和 next 方法。
* 类的构造函数和 next 方法的逻辑基本保持一致。
*/
import java.util.*;
public class RLEIterator {
private Queue<int[]> queue;
public RLEIterator(int[] encoding) {
queue = new LinkedList<>();
for (int i = 0; i < encoding.length; i += 2) {
if (encoding[i] > 0) {
queue.offer(new int[] {encoding[i], encoding[i + 1]});
}
}
}
public int next(int n) {
while (!queue.isEmpty() && n > 0) {
int[] current = queue.peek();
if (n < current[0]) {
current[0] -= n;
return current[1];
} else {
n -= current[0];
queue.poll();
}
}
return queue.isEmpty() ? -1 : queue.peek()[1];
}
}
解释
方法:
该题解利用两个指针(index和count)来模拟RLE迭代器的行为。index指向当前考虑的编码元素,而count记录当前元素已经返回的次数。在next函数中,首先检查是否有足够的元素可以返回。如果当前元素剩余的数量(encoding[index] - count)小于n,说明当前元素不足以满足请求,因此将n减去可用的数量,并将index向前移动到下一个元素。如果当前元素足够,则增加count并返回当前元素的值。如果所有元素都已被遍历完而仍未能满足n的要求,则返回-1。
时间复杂度:
O(k) 其中k是next调用的次数
空间复杂度:
O(n) 其中n是编码数组的长度
代码细节讲解
🦆
在初始化RLEIterator时,如何处理输入数组encoding长度为奇数的情况?
▷🦆
在next方法中,如果n为负数或零,这个实现会如何处理?
▷🦆
为什么在遍历完所有元素后返回-1,而不是抛出异常或返回其他特定值?
▷🦆
在next方法中,当满足`self.count + n > self.encoding[self.index]`条件时,为什么要将self.count重置为0?
▷