251. Flatten 2D Vector
题目:
Implement an iterator to flatten a 2d vector.
For example,
Given 2d vector =
[
[1,2],
[3],
[4,5,6]
]
By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,2,3,4,5,6].
Hint:
- How many variables do you need to keep track?
 - Two variables is all you need. Try with 
xandy. - Beware of empty rows. It could be the first few rows.
 - To write correct code, think about the invariant to maintain. What is it?
 - The invariant is 
xandymust always point to a valid point in the 2d vector. Should you maintain your invariant ahead of time or right when you need it? - Not sure? Think about how you would implement 
hasNext(). Which is more complex? - Common logic in two different places should be refactored into a common method.
 
Follow up:
As an added challenge, try to code it using only iterators in C++ or iterators in Java.
链接: http://leetcode.com/problems/flatten-2d-vector/
题解:
构造一个2D的iterator。不太理解iterator的原理,第一想法是把vec2d里面的元素都读到Queue里 ,然后再逐个读取。这样的话初始化需要O(n), next和hasNext都为O(1),Space Complexity也是O(n),虽然能ac,但是当vec2d足够大的时候会出问题。
Time Complexity - constructor - O(n), hasNext - O(1), next() - O(1), Space Complexity - O(n)。
public class Vector2D {
    private Queue<Integer> vec1d;
    public Vector2D(List<List<Integer>> vec2d) {
        vec1d = new LinkedList<>();
        for(List<Integer> list : vec2d) {
            for(int i : list) {
                vec1d.offer(i);
            }
        }
    }
    public int next() {
        if(hasNext())
            return vec1d.poll();
        else
            return Integer.MAX_VALUE;
    }
    public boolean hasNext() {
        return vec1d.size() > 0;
    }
}
/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D i = new Vector2D(vec2d);
 * while (i.hasNext()) v[f()] = i.next();
 */
Update: 保存两个变量来遍历vec2d
public class Vector2D {
    private List<List<Integer>> list;
    private int listIndex;
    private int elemIndex;
    public Vector2D(List<List<Integer>> vec2d) {
        list = vec2d;
        listIndex = 0;
        elemIndex = 0;
    }
    public int next() {
        return list.get(listIndex).get(elemIndex++);
    }
    public boolean hasNext() {
        while(listIndex < list.size()) {
            if(elemIndex < list.get(listIndex).size()) {
                return true;
            } else {
                listIndex++;
                elemIndex = 0;
            }
        }
        return false;
    }
}
/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D i = new Vector2D(vec2d);
 * while (i.hasNext()) v[f()] = i.next();
 */
二刷:
使用了ArrayList的iterator,这个算不算作弊...思路就是,一开始把vec2d里面每个list的iterator都加入到一个iters的ArrayList里。之后就可以很简单地写好hasNext()和next()两个方法了。
Java:
public class Vector2D implements Iterator<Integer> {
    private List<Iterator<Integer>> iters;
    private int curLine = 0;
    public Vector2D(List<List<Integer>> vec2d) {
        this.iters = new ArrayList<>();
        for (List<Integer> list : vec2d) {
            iters.add(list.iterator());
        }
    }
    @Override
    public Integer next() {
        return iters.get(curLine).next();
    }
    @Override
    public boolean hasNext() {
        while (curLine < iters.size()) {
            if (iters.get(curLine).hasNext()) return true;
            else curLine++;
        }
        return false;
    }
}
/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D i = new Vector2D(vec2d);
 * while (i.hasNext()) v[f()] = i.next();
 */
Update:
还是使用两个元素来遍历
public class Vector2D implements Iterator<Integer> {
    private List<List<Integer>> list;
    private int curLine = 0;
    private int curElem = 0;
    public Vector2D(List<List<Integer>> vec2d) {
        this.list = vec2d;
    }
    @Override
    public Integer next() {
        return list.get(curLine).get(curElem++);
    }
    @Override
    public boolean hasNext() {
        while (curLine < list.size()) {
            if (curElem < list.get(curLine).size()) {
                return true;
            } else {
                curLine++;
                curElem = 0;
            }
        }
        return false;
    }
}
/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D i = new Vector2D(vec2d);
 * while (i.hasNext()) v[f()] = i.next();
 */

Reference:
http://web.cse.ohio-state.edu/software/2231/web-sw2/extras/slides/17a.Iterators.pdf
http://docs.oracle.com/javase/7/docs/api/
http://stackoverflow.com/questions/21988341/how-to-iterate-through-two-dimensional-arraylist-using-iterator
http://www.cs.cornell.edu/courses/cs211/2005fa/Lectures/L15-Iterators%20&%20Inner%20Classes/L15cs211fa05.pdf
https://leetcode.com/discuss/50292/7-9-lines-added-java-and-c-o-1-space
https://leetcode.com/discuss/55199/pure-iterator-solution-additional-data-structure-list-get
https://leetcode.com/discuss/57984/simple-and-short-java-solution-with-iterator
https://leetcode.com/discuss/50356/my-concise-java-solution
https://leetcode.com/discuss/68860/java-o-1-space-solution
https://leetcode.com/discuss/71002/java-solution-beats-60-10%25
251. Flatten 2D Vector的更多相关文章
- 251. Flatten 2D Vector 平铺二维矩阵
		
[抄题]: Implement an iterator to flatten a 2d vector. Example: Input: 2d vector = [ [1,2], [3], [4,5,6 ...
 - LeetCode 251. Flatten 2D Vector
		
原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...
 - [LeetCode] 251. Flatten 2D Vector 压平二维向量
		
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
 - [LeetCode] Flatten 2D Vector 压平二维向量
		
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
 - Flatten 2D Vector
		
Implement an iterator to flatten a 2d vector. For example, Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
 - LeetCode Flatten 2D Vector
		
原题链接在这里:https://leetcode.com/problems/flatten-2d-vector/ 题目: Implement an iterator to flatten a 2d v ...
 - [Locked] Flatten 2D Vector
		
Problem Description: Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [ ...
 - [Swift]LeetCode251.展平二维向量 $ Flatten 2D Vector
		
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [1,2], [3], [4,5,6] ] ...
 - Flatten 2D Vector -- LeetCode
		
Implement an iterator to flatten a 2d vector. For example,Given 2d vector = [ [,], [], [,,] ] By cal ...
 
随机推荐
- Oracle bbed 实用示例-----修改Data内容、恢复delete的rows
			
bbed 可以在db open 状态来进行修改,但是建议在做任何修改操作之前先shutdown db. 这样避免checkpoint 进程重写bbed 对block 的修改. 也避免oracle 在b ...
 - Wpf从资源中重用UI元素
			
在我的界面上有几个选项卡,每个选项卡中都有下面的元素: <StackPanel Orientation="Horizontal"> <Button Content ...
 - R语言基础(一) 可视化基础
			
##数据获取 x1=round(runif(100,min=80,max=100)) x2=round(rnorm(100,mean=80, sd=7)) x3=round(rnorm(100,mea ...
 - 【转载】MySQL查询阻塞语句
			
select r.trx_id waiting_trx_id, r.trx_mysql_thread_Id waiting_thread, r.trx_query waiting_que ...
 - C#模拟键盘鼠标事件 SendKeys 的特殊键代码表(转)
			
使用 SendKeys 将键击和组合键击发送到活动应用程序.此类无法实例化.若要发送一个键击给某个类并立即继续程序流,请使用 Send.若要等待键击启动的任何进程,请使用 SendWait. 每个键都 ...
 - I/O空间映射
			
转自:http://www.cnblogs.com/hydah/archive/2012/04/10/2232117.html 注:部分资料和图片来源于网络,本文在学习过程中对网络资源进行再整理. I ...
 - Android使用XML做动画UI
			
在Android应用程序,使用动画效果,能带给用户更好的感觉.做动画可以通过XML或Android代码.本教程中,介绍使用XML来做动画.在这里,介绍基本的动画,如淡入,淡出,旋转等. 效果: htt ...
 - NPOI读取Excel数据应用
			
NPOI 是 POI 项目的 .NET 版本.使用 NPOI 你就可以在没有安装 Office 或者相应环境的机器上对 WORD/EXCEL 文档进行读写.NPOI是构建在POI 3.x版本之上的,它 ...
 - mysql数据库连接池 手动编写
			
源码来源于http://www.toutiao.com/a6350448676050174209/,留存以供以后参考学习 先上一张项目托普图 然后分别列出各个文件的源码: MyPool.java(就是 ...
 - Hadoop以及其外围生态系统的安装参考
			
在研究Hadoop的过程中使用到的参考文档: 1.Hadoop2.2 参考文档 在CentOS上安装Hadoop 2.x 集群: http://cn.soulmachine.me/blog/201 ...