题目描述

给你一个嵌套的整型列表。请你设计一个迭代器,使其能够遍历这个整型列表中的所有整数。
列表中的每一项或者为一个整数,或者是另一个列表。其中列表的元素也可能是整数或是其他列表。
示例 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)

    1. class NestedIterator(object):
    2. def dfs(self, nests):
    3. for nest in nests:
    4. if nest.isInteger(): # 如果是int,则加入队列
    5. self.queue.append(nest.getInteger())
    6. else: # 否则就递归遍历子list
    7. self.dfs(nest.getList())
    8. def __init__(self, nestedList):
    9. self.queue = collections.deque()
    10. self.dfs(nestedList)
    11. def next(self):
    12. return self.queue.popleft()
    13. def hasNext(self):
    14. return len(self.queue)

    法二:迭代

  • 在调用hasNext() or next() 进行扁平化

    • 一边迭代一边获取当前的结果,而不是提前初始化好
    • 把当前list逆序放入栈中(先进后出)
    • 在hasNext() 中访问栈顶元素
      • 若是int,返回true;然后next()被调用,把栈顶int 弹出
      • 若是list 则把当前列表的各个元素逆序放入栈中
      • 若栈为空则结束,返回false
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

    1. class NestedIterator(object):
    2. def __init__(self, nestedList):
    3. self.stack = []
    4. for i in range(len(nestedList) - 1, -1, -1): # range(start, stop[, step]) 逆序入栈
    5. self.stack.append(nestedList[i])
    6. def next(self):
    7. cur = self.stack.pop()
    8. return cur.getInteger()
    9. def hasNext(self):
    10. while self.stack:
    11. cur = self.stack[-1]
    12. if cur.isInteger():
    13. return True
    14. self.stack.pop()
    15. for i in range(len(cur.getList()) - 1, -1, -1): # 若是子list,则入栈进行迭代
    16. self.stack.append(cur.getList()[i])
    17. return False
    1. class NestedIterator {
    2. private:
    3. stack<NestedInteger> st;
    4. public:
    5. NestedIterator(vector<NestedInteger> &nestedList) {
    6. for (int i=nestedList.size() - 1; i>=0; --i) { // 逆序入栈
    7. st.push(nestedList[i]);
    8. }
    9. }
    10. int next() {
    11. NestedInteger cur = st.top();
    12. st.pop();
    13. return cur.getInteger();
    14. }
    15. bool hasNext() {
    16. while (!st.empty()) {
    17. NestedInteger cur = st.top();
    18. if (cur.isInteger()) {
    19. return true;
    20. }
    21. st.pop();
    22. for (int i=cur.getList().size() - 1; i>=0; --i) {
    23. st.push(cur.getList()[i]);
    24. }
    25. }
    26. return false;
    27. }
    28. };