class RLEIterator { private int[] encoding; private int major = 0; private int minor = 0; public RLEIterator(int[] encoding) { this.encoding = encoding; } private void nextSegment() { major += 2; minor = 0; } private int lastConsumed() { if (major == 0 && minor == 0) { // Haven't consumed anything return -1; } else if (major <= encoding.length && minor == 0) { // Consumed last element of a previous segment return encoding[major - 1]; } else if (major >= encoding.length) { // Everything was consumed return -1; } // Last consumed from the current segment return encoding[major + 1]; } public int next(int n) { while (n > 0 && major < encoding.length) { int consumed = Math.min(n, encoding[major] - minor); n -= consumed; minor += consumed; if (minor == encoding[major]) { nextSegment(); } } if (n > 0) { return -1; } return lastConsumed(); } } /** * Your RLEIterator object will be instantiated and called as such: * RLEIterator obj = new RLEIterator(encoding); * int param_1 = obj.next(n); */