LeetCode 251 Flatten 2D Vector

296 阅读1分钟

LeetCode 251 Flatten 2D Vector

链接:leetcode.com/problems/fl…

方法:双指针

时间复杂度: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();
    }
}