List里可以有int或者List,然后里面的List里面可以再有List.

用Stack来做比较直观

Iterator无非是next()或者hasNext()这2个方程

一开始我想的是hasNext()就简单的返还是不是空就行,主要的操作在next()里,结果发现无线循环。。好蠢

然后看网上答案改的在hasNext()里准备好,其实一开始的想法不一定错,二刷可以试试。

简单的说就是先都塞到STACK里面,如果Peek的元素是单一int就返还TRUE,然后next()会直接返还那个int。

如果不是单一int,是另一个List,那么把这个List给POP出来,再倒着塞回到stack。

再PEEK第一个,直到是单一INT。

当然,如果没元素了直接返还FALSE就行了,思路很清晰。。


public Stack<NestedInteger> stack = new Stack<>(); public NestedIterator(List<NestedInteger> nestedList) {
for(int n = nestedList.size()-1; n >=0;n--)
{
stack.push(nestedList.get(n));
}
} @Override
public Integer next()
{
if(hasNext()) return stack.pop().getInteger();
else return null;
} @Override
public boolean hasNext() { while(!stack.isEmpty())
{
if(stack.peek().isInteger())
{
return true;
}
else
{
NestedInteger tempNested = stack.pop();
for(int n = tempNested.getList().size()-1; n >= 0;n--)
{
stack.push(tempNested.getList().get(n));
}
}
}
return false;
}

感觉上不是特别难,但是牵扯到的别的概念太多了。

需要注意的是各种TYPE的DECLARE。

一开始挺接近的,使使劲说不定能做出来。


二刷没想到用STACK,用LIST楞做的。在constructor里直接遍历,Integer就加进去,Nested就展开。

有int加int,不是int展开继续加int。

最后就是一个list有所有int,然后就iterator.

public class NestedIterator implements Iterator<Integer> {

    List<Integer> list;

    public NestedIterator(List<NestedInteger> nestedList)
{
list = new ArrayList<Integer>();
for(int i = 0; i < nestedList.size();i++)
{
if(nestedList.get(i).isInteger()) list.add(nestedList.get(i).getInteger());
else
{
List<NestedInteger> tempList = new ArrayList<NestedInteger>(nestedList.get(i).getList());
NestedIterator iter = new NestedIterator(tempList);
while(iter.hasNext()) list.add(iter.next()); }
} } @Override
public Integer next()
{
Integer res = new Integer(list.get(0));
list.remove(0);
return res; } @Override
public boolean hasNext()
{
return list.size() != 0;
}
}

一刷的做法是用stack,添加的时候不操作,遍历的时候进行判断和展开LIST的 操作。

二刷的做法是添加的时候都展了,遍历的时候不展了。 第一种时间上快一些。



三刷

这个题看起来挺难的,但是一刷二刷完全没有印象,回过头看了一下明白怎么回事了。

我一刷应该是看答案的做的,用的stack倒着加,每次POP出一个看是不是Integer,是的话返还,不是的话展开再加。比较直白的做法,需要消耗很大的空间,取决于Stack的大小,具体大小不好算,跟单一枝的宽度有关。

二刷更蠢= =直接完全展开,还不如一刷。。

三刷应该是很合理的,stack里存放的是Iterator,其实相当于保存了一个指针,我们通过pop来back track到当时的位置。。思想是DFS。

这个题更为关键的是应该抽象出树状图的概念,来做in Order。 i.isInteger()说明是一个leave,!i.isInteger()说明是新的subtree,此时要入栈记录位置,以便DFS的时候回到这里。

public class NestedIterator implements Iterator<Integer> {

    Stack<Iterator<NestedInteger>> stk;
Iterator<NestedInteger> tempIter;
Integer temp = null;
public NestedIterator(List<NestedInteger> nestedList) {
stk = new Stack<Iterator<NestedInteger>>();
tempIter = nestedList.iterator();
temp = findNextInt();
} @Override
public Integer next() {
int res = temp;
temp = findNextInt();
return res;
} public Integer findNextInt() {
while (tempIter.hasNext() || !stk.isEmpty()) {
if (tempIter.hasNext()) {
NestedInteger i = tempIter.next();
if (i.isInteger()) {
return i.getInteger();
} else {
stk.push(tempIter);
tempIter = i.getList().iterator();
}
} else {
tempIter = stk.pop();
}
}
return null;
} @Override
public boolean hasNext() {
return temp != null; }
}

341. Flatten Nested List Iterator的更多相关文章

  1. [leetcode]341. Flatten Nested List Iterator展开嵌套列表的迭代器

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  2. 341. Flatten Nested List Iterator展开多层数组

    [抄题]: Given a nested list of integers, implement an iterator to flatten it. Each element is either a ...

  3. [LeetCode] 341. Flatten Nested List Iterator 压平嵌套链表迭代器

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  4. 【leetcode】341. Flatten Nested List Iterator

    题目如下: Given a nested list of integers, implement an iterator to flatten it. Each element is either a ...

  5. 【LeetCode】341. Flatten Nested List Iterator 解题报告(Python&C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归+队列 栈 日期 题目地址:https://lee ...

  6. LeetCode 341. Flatten Nested List Iterator

    https://leetcode.com/problems/flatten-nested-list-iterator/

  7. [LintCode] Flatten Nested List Iterator 压平嵌套链表迭代器

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  8. [LeetCode] Flatten Nested List Iterator 压平嵌套链表迭代器

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

  9. Leetcode: Flatten Nested List Iterator

    Given a nested list of integers, implement an iterator to flatten it. Each element is either an inte ...

随机推荐

  1. (WinForm)FormBorderStyle属性

    此属性就是获取或设置窗体的边框样式,默认值为 FormBorderStyle.Sizable.共7个值. 属性 意义 None 无边框 FixedSingle 固定的单行边框 Fixed3D 固定的三 ...

  2. DOM Ready 详解

    DOM Ready 概述 熟悉jQuery的人, 都知道DomReady事件. window.onload事件是在页面所有的资源都加载完毕后触发的. 如果页面上有大图片等资源响应缓慢, 会导致wind ...

  3. PHP 冒泡排序法

    <?php // 冒泡排序法:将一个数组中的值按照从小到大的顺 序排序 $arr = array(33, 1, 4, 5, 2, 3, 7, 9, 8, 99); $len = count($a ...

  4. hadoop2.610集群配置(包含HA和Hbase )

    .修改Linux主机名2.修改IP3.修改主机名和IP的映射关系######注意######如果你们公司是租用的服务器或是使用的云主机(如华为用主机.阿里云主机等)/etc/hosts里面要配置的是内 ...

  5. Python学习笔记——正则表达式入门

    # 本文对正则知识不做详细解释,仅作入门级的正则知识目录. 正则表达式的强大早有耳闻,大一时参加一次选拔考试,题目就是用做个HTML解析器,正则的优势表现得淋漓尽致.题外话不多讲,直接上干货: 1. ...

  6. uploadify实现七牛云存储 显示上传进度+页面显示

    准备: uploadify下载地址: http://www.uploadify.com/download/ 七牛 php-sdk开发指南: http://developer.qiniu.com/doc ...

  7. STM32之系统滴答定时器

    一.SysTick(系统滴答定时器)概述 操作系统需要一个滴答定时器周期性产生中断,以产生系统运行的节拍.在中断服务程序里,基于优先级调度的操作系统会根据进程优先级切换任务,基于时间片轮转系统会根据时 ...

  8. POJ 3267 The Cow Lexicon 简单DP

    题目链接: http://poj.org/problem?id=3267 从后往前遍历,dp[i]表示第i个字符到最后一个字符删除的字符个数. 状态转移方程为: dp[i] = dp[i+1] + 1 ...

  9. MYSQL数据库备份与恢复【转】

    mysqldump -h主机名  -P端口 -u用户名 -p密码 (–database) 数据库名 > 文件名.sql  在window上需要通过CMD进入mysql安装目录下的bin目录下执行 ...

  10. BZOJ 1725: [Usaco2006 Nov]Corn Fields牧场的安排

    Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M<=12; 1<=N<=12),每一格都是一块正方形的土地.FJ打算在牧 ...