原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/
题目:
Implement an iterator to flatten a 2d vector.
Example:
Input: 2d vector =
[
[1,2],
[3],
[4,5,6]
]
Output: [1,2,3,4,5,6]
Explanation: By calling next repeatedly until hasNext returns false,
the order of elements returned by next should be: [1,2,3,4,5,6] .
Follow up:
As an added challenge, try to code it using only iterators in C++ or iterators in Java.
题解:
用两个index 分别记录list 的 index 和当前 list的element index.
Time Complexity: Vector2D() O(1). hasNext() O(vec2d.size()). next() O(1). Space: O(1).
AC Java:
1 public class Vector2D {
2 List<List<Integer>> listOfList;
3 int listIndex;
4 int elemIndex;
5 public Vector2D(List<List<Integer>> vec2d) {
6 listOfList = vec2d;
7 listIndex = 0;
8 elemIndex = 0;
9 }
10
11 public int next() {
12 return listOfList.get(listIndex).get(elemIndex++);
13 }
14
15 public boolean hasNext() {
16 while(listIndex < listOfList.size()){
17 if(elemIndex < listOfList.get(listIndex).size()){
18 return true;
19 }else{
20 listIndex++;
21 elemIndex = 0;
22 }
23 }
24 return false;
25 }
26 }
27
28 /**
29 * Your Vector2D object will be instantiated and called as such:
30 * Vector2D i = new Vector2D(vec2d);
31 * while (i.hasNext()) v[f()] = i.next();
32 */
Follow up 要用Iterator class.
Time Complexity: Vector2D() O(1). hasNext() O(vec2d.size()). next() O(1). Space: O(1).
AC Java:
1 public class Vector2D implements Iterator<Integer> {
2 Iterator<List<Integer>> i;
3 Iterator<Integer> j;
4
5 public Vector2D(List<List<Integer>> vec2d) {
6 i = vec2d.iterator();
7 }
8
9 @Override
10 public Integer next() {
11 return j.next();
12 }
13
14 @Override
15 public boolean hasNext() {
16 while((j==null || !j.hasNext()) && i.hasNext()){
17 j = i.next().iterator();
18 }
19
20 return j!=null && j.hasNext();
21 }
22 }
23
24 /**
25 * Your Vector2D object will be instantiated and called as such:
26 * Vector2D i = new Vector2D(vec2d);
27 * while (i.hasNext()) v[f()] = i.next();
28 */
类似Flatten Nested List Iterator.