题目描述
给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。
列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。
示例 1:
输入: [[1,1],2,[1,1]]
输出: [1,1,2,1,1]
解释: 通过重复调用 next 直到 hasNext 返回 false,next 返回的元素的顺序应该是: [1,1,2,1,1]。
- 地址:https://leetcode-cn.com/problems/flatten-nested-list-iterator/
- 2021/03/23
巨人的肩膀:https://leetcode-cn.com/problems/flatten-nested-list-iterator/solution/fu-xue-ming-zhu-xiang-jie-ti-yi-shu-li-d-n4qa/
法一:递归 + 队列
在构造函数处提前扁平化
- 遍历嵌套列表的所有元素,判断每个元素的类型(int / list)
- 如果当前元素是int,那么放入队尾
- 若是list,则递归遍历该list
- 时间复杂度 O(n)
空间复杂度 O(n)
class NestedIterator(object):def dfs(self, nests):for nest in nests:if nest.isInteger(): # 如果是int,则加入队列self.queue.append(nest.getInteger())else: # 否则就递归遍历子listself.dfs(nest.getList())def __init__(self, nestedList):self.queue = collections.deque()self.dfs(nestedList)def next(self):return self.queue.popleft()def hasNext(self):return len(self.queue)
法二:迭代
在调用hasNext() or next() 进行扁平化
- 一边迭代一边获取当前的结果,而不是提前初始化好
- 栈
- 把当前list逆序放入栈中(先进后出)
- 在hasNext() 中访问栈顶元素
- 若是int,返回true;然后next()被调用,把栈顶int 弹出
- 若是list 则把当前列表的各个元素逆序放入栈中
- 若栈为空则结束,返回false
- 时间复杂度:O(n)
空间复杂度:O(n)
class NestedIterator(object):def __init__(self, nestedList):self.stack = []for i in range(len(nestedList) - 1, -1, -1): # range(start, stop[, step]) 逆序入栈self.stack.append(nestedList[i])def next(self):cur = self.stack.pop()return cur.getInteger()def hasNext(self):while self.stack:cur = self.stack[-1]if cur.isInteger():return Trueself.stack.pop()for i in range(len(cur.getList()) - 1, -1, -1): # 若是子list,则入栈进行迭代self.stack.append(cur.getList()[i])return False
class NestedIterator {private:stack<NestedInteger> st;public:NestedIterator(vector<NestedInteger> &nestedList) {for (int i=nestedList.size() - 1; i>=0; --i) { // 逆序入栈st.push(nestedList[i]);}}int next() {NestedInteger cur = st.top();st.pop();return cur.getInteger();}bool hasNext() {while (!st.empty()) {NestedInteger cur = st.top();if (cur.isInteger()) {return true;}st.pop();for (int i=cur.getList().size() - 1; i>=0; --i) {st.push(cur.getList()[i]);}}return false;}};
