原题链接在这里: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 */