LeetCode 251 Flatten 2D Vector
方法:双指针
时间复杂度:O(n)
空间复杂度:O(n)
想法:又是类似把一个嵌套型的数据结构遍历的题目,主要是学习一下这样一种做法:在hasNext()里处理完所有的乱七八糟的问题,然后再hasNext()运行结束的时候,两个指针都已经挪完了,已经指到了下一个合法的元素。因为这题里面会给一些空数组,因此用while (p1 < v.length && p2 == v[p1].length)为条件跨到下一个地方。然后在调任何next()之前,先调hasNext()保证指向合理的位置,然后next()就直接返回值然后移指针。
代码:
class Vector2D {
private int p1, p2;
private int[][] v;
public Vector2D(int[][] vec) {
this.v = vec;
this.p1 = 0;
this.p2 = 0;
}
public int next() {
hasNext();
return v[p1][p2++];
}
public boolean hasNext() {
while (p1 < v.length && p2 == v[p1].length) {
p1++;
p2 = 0;
}
return p1 < v.length;
}
}
如果是用迭代器来写,也一样:
class Vector2D {
private List<List<Integer>> v;
private Iterator<List<Integer>> p1;
private Iterator<Integer> p2;
public Vector2D(int[][] vec) {
this.v = new ArrayList<>();
for (int[] ve : vec) {
List<Integer> tmp = Arrays.stream(ve).boxed().collect(Collectors.toList());
v.add(tmp);
}
p1 = v.iterator();
}
public int next() {
hasNext();
return p2.next();
}
public boolean hasNext() {
while ((p2 == null || !p2.hasNext()) && p1.hasNext()) {
p2 = p1.next().iterator();
}
return p2 != null && p2.hasNext();
}
}