LeetCode 第341题:扁平化嵌套列表迭代器
2021-05-03 本文已影响0人
放开那个BUG
1、前言
题目描述2、思路
这道题看上去是一个迭代器的问题(其实也是一个迭代器的问题),但是看完给的 case 示例发现嵌套不止一层,而是有很多层,看上去就是一棵树的遍历一样。
所以本题最简单的思路:首先使用树的遍历,将所有的节点都遍历出来,一次性装在一个 list 里,后面 hastnext、next 函数直接就变成了针对于 list 的操作,简化了代码,采用 dfs、bfs 均可。
但是一次性加载可能会有内存的问题,进阶思路是采用惰性加载,采用 bfs 的思路,如果加载的某个数是 list,则一直循环加载直到它是一个 integer。我就不写这种解法了,也很简单。
3、代码
public class NestedIterator implements Iterator<Integer> {
private List<Integer> res = new ArrayList<>();
private int index = 0;
public NestedIterator(List<NestedInteger> nestedList) {
helper(nestedList);
}
private void helper(List<NestedInteger> nestedList){
for(NestedInteger nestedInteger : nestedList){
if(nestedInteger.isInteger()){
res.add(nestedInteger.getInteger());
continue;
}
helper(nestedInteger.getList());
}
}
@Override
public Integer next() {
if(!this.hasNext()){
return -1;
}
Integer integer = res.get(index++);
return integer;
}
@Override
public boolean hasNext() {
if(res.size() != 0 && index < res.size()){
return true;
}
return false;
}
}