Leetcode 900. RLE Iterator

Problem Explanation

The problem requires writing an iterator which will handle a run-length encoded sequence of integers. The iterator is initialized with an int array being a run-length encoding of some sequence. For every even index i, A[i] indicates the number of times the non-negative integer value A[i+1] is repeated in the sequence. The iterator supports next(int n) operation which exhausts the next n elements and returns the last element exhausted in this way. If there is no more element left to exhaust, next() operation returns -1.

Approach of the Solution

To solve this problem, we will follow a simple approach. RLEIterator will maintain a pointer (or index) to the sequence which represents where in the sequence we are currently pointing at.

This index will update (increment by 2) only when the current count (which is pointed by index) becomes 0 and we have to move to the next pair as there are no more elements for the current pair.

When we execute next(n), it moves forward by n steps. If there are not enough numbers, next(n) will use up the next number and continue to the following ones. next(n) will return -1 if it can't exhaust n numbers.

To implement this logic, consider A = [3,8,0,9,2,5] which is a run-length encoding of the sequence [8,8,8,5,5]. We initiate our iterator at index 0 on A. When next(2) is called, we check if n is less or equal to A[0] (the count of first value), if yes then we reduce A[0] by n and return A[1] (value at first place), if not then we reduce n by A[0] and move the pointer to next pair.

Python Solution

1
2python
3class RLEIterator:
4
5    def __init__(self, A):
6        # Initialize the pointer to starting position
7        self.A = A
8        self.i = 0
9
10    def next(self, n):
11        while self.i < len(self.A):
12            # If the current number is greater than or equal to n
13            if self.A[self.i] >= n:
14                self.A[self.i] -= n
15                return self.A[self.i+1]
16            else:
17                # Decrease n by the available count for current value
18                n -= self.A[self.i]
19                # Move the pointer to the next pair
20                self.i += 2
21        # If no more elements to exhaust
22        return -1

Java Solution

1
2java
3class RLEIterator {
4    int[] A;
5    int i;
6
7    public RLEIterator(int[] A) {
8        this.A = A;
9        this.i = 0;
10    }
11
12    public int next(int n) {
13        while (i < A.length) {
14            if (A[i] >= n) {
15                A[i] -= n;
16                return A[i+1];
17            } else {
18                n -= A[i];
19                i += 2;
20            }
21        }
22        return -1;
23    }
24}

C++ Solution

1
2cpp
3class RLEIterator {
4public:
5    RLEIterator(vector<int>& A) : i(0), q(A) {}
6
7    int next(int n) {
8        while (i < q.size() && q[i] < n) {
9            n -= q[i];
10            i += 2;
11        }
12        if (i >= q.size())
13            return -1;
14        q[i] -= n;
15        return q[i+1];
16    }
17private:
18    int i;
19    vector<int> q;
20};

C# Solution

1
2csharp
3public class RLEIterator {
4    int[] A;
5    int i;
6
7    public RLEIterator(int[] A) {
8        this.A = A;
9        this.i = 0;
10    }
11
12    public int Next(int n) {
13        while (i < A.Length) {
14            if (A[i] >= n) {
15                A[i] -= n;
16                return A[i+1];
17            } else {
18                n -= A[i];
19                i += 2;
20            }
21        }
22        return -1;
23    }
24}

Javascript Solution

1
2javascript
3class RLEIterator {
4    constructor(A) {
5        this.A = A;
6        this.i = 0;
7    }
8
9    next(n) {
10        while (this.i < this.A.length) {
11            if (this.A[this.i] >= n) {
12                this.A[this.i] -= n;
13                return this.A[this.i+1];
14            } else {
15                n -= this.A[this.i];
16                this.i += 2;
17            }
18        }
19        return -1;
20    }
21}

It's worth noting, in every solution above, an array (or vector) to store the run-length encoding of the sequence and an integer to keep the current location of the iterator are used. I hope that the above walkthrough, algorithms, and code solutions will guide you in solving this problem.# Understanding and Applying the Solutions

The solutions presented above in Python, Java, JavaScript, C# and C++ all use the same algorithm but mix imperative and object-oriented paradigms differently due to each language's syntax and features.

Despite their initial differences, all solutions represent the same concept: They actively keep track of the position of the iterator in the array using an index, and update this index whenever appropriate.

The Java and C# solutions, for example, start by defining a public class with private instance variables for the array and index. JavaScript and Python, on the other hand, define a constructor function that initializes the instance variables.

Most solutions then implement the same algorithm:

  • They define next(int n) function that iterates through the array while the iterator’s index is less than the array length.
  • Inside the loop, if the current count in the array at index i is greater than or equal to n, they decrease the current count at i by n, then return the current value at index i+1.
  • If the current count i is less than n, they subtract A[i] from n and move the index to the next pair (i += 2).
  • Once the loop ends, if there are no more elements left to exhaust, the function returns -1.

In your application, choose the suitable language implementation according to your project requirements and the language preferences of your team.

Please note that the efficiency of the solution can be different in different languages due to their internal implementation of arrays and object-oriented features. It's always necessary to measure the performance and optimize it if need be for complex real-life situations.

The solutions provided here should at the least form a basic solution for the problem and provide a good starting point for optimization.


Got a question? Ask the Teaching Assistant anything you don't understand.

Still not clear? Ask in the Forum,  Discord or Submit the part you don't understand to our editors.


TA 👨‍🏫