题目地址:

https://www.lintcode.com/problem/zigzag-iterator-ii/description

给定若干个list,要求构造一个迭代器,它的遍历顺序是一列一列遍历。这里的一列一列遍历的意思是,比如说将这些list作为行排成二维数组的话(注意,这里每一行未必长度相等),那么可以写成:A=[a00a01...a0s0a10a11...a1s1...ak0ak1...aksk]A=\left[ \begin{array}{l} a_{00} & a_{01} & ... & a_{0s_0}\\ a_{10} & a_{11} & ... & a_{1s_1}\\ ...\\ a_{k0} & a_{k1} & ... & a_{ks_k} \end{array}\right ]A=⎣⎢⎢⎡​a00​a10​...ak0​​a01​a11​ak1​​.........​a0s0​​a1s1​​aksk​​​⎦⎥⎥⎤​那么遍历顺序应该是a00→a10→...→ak0→a01→a11→...a_{00}\to a_{10} \to ... \to a_{k0} \to a_{01}\to a_{11}\to ...a00​→a10​→...→ak0​→a01​→a11​→...,也就是先尝试竖着遍历,遍历到底了再另起一列。

思路是,先把每个list的迭代器存进一个list里,另外再开个变量保存当前遍历到了哪个list了。hasNext其实就是在找哪一行的迭代器的hasNext为true。调用next的时候,只需要先调用hasNext,将光标移到hasNext为true的那一行,接着调用next即可,注意,此时需要将光标向下移动一行,否则下次调用next的时候就是遍历的之前刚遍历的那一行了。代码如下:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;public class ZigzagIterator2 {private List<Iterator<Integer>> list;private int idx;/** @param vecs: a list of 1d vectors*/public ZigzagIterator2(List<List<Integer>> vecs) {// do intialization if necessarylist = new ArrayList<>();for (List<Integer> vec : vecs) {list.add(vec.iterator());}}/** @return: An integer*/public int next() {// write your code herehasNext();// 把结果缓存一下int res = list.get(idx).next();// 将idx下移一格idx = (idx + 1) % list.size();return res;}/** @return: True if has next*/public boolean hasNext() {// write your code here// 如果当前行还有值,则返回trueif (list.get(idx).hasNext()) {return true;}int tmp = idx;// 否则向后循环遍历,直到遍历到有值的一行,或者回到起点idx = (idx + 1) % list.size();while (idx != tmp) {if (list.get(idx).hasNext()) {return true;}idx = (idx + 1) % list.size();}return false;}
}

两个操作时间复杂度是O(n)O(n)O(n),nnn为行数,空间也是O(n)O(n)O(n)。这个时间复杂度看起来很高,但是由于一旦调用了hasNext之后,迭代器就不会回头了,所以每个数字其实只会遍历一次,真实耗费时间并没有那么多。

【Lintcode】541. Zigzag Iterator II相关推荐

  1. 【LeetCode】【HOT】142. 环形链表 II(快慢指针)

    [LeetCode][HOT]142. 环形链表 II 文章目录 [LeetCode][HOT]142. 环形链表 II package hot;class ListNode{int val;List ...

  2. 【LeetCode】House Robber I II 解题报告

    [题目] I You are a professional robber planning to rob houses along a street. Each house has a certain ...

  3. 【LibreOJ】#541. 「LibreOJ NOIP Round #1」七曜圣贤

    [题意]一开始车上有编号为0~a的红茶,过程中出现的红茶编号仅有[0,b),有三种操作: 1.买进编号未在车上出现过的红茶. 2.丢掉车上指定编号的红茶. 3.将最早丢出去的红茶捡回来. 每次操作后求 ...

  4. 【leetcode】132. Palindrome Partitioning II

    题目如下: 解题思路:本题是[leetcode]131. Palindrome Partitioning的升级版,要求的是求出最小cuts,如果用[leetcode]131. Palindrome P ...

  5. 【LintCode】算法题 1443. 最长AB子串

    描述 给你一个只由字母'A'和'B'组成的字符串s,找一个最长的子串,要求这个子串里面'A'和'B'的数目相等,输出该子串的长度. 这个子串可以为空. s的长度n满足 2<=n<=1000 ...

  6. 【lintcode】树形数据结构之Maxtree, Tree iterator, remove bst node, 优先队列之动态中位数Median, 矩阵dfs之word search II,最大连

    解析 max ksubarray sum:  最大和 of 连续子序列 =>   最大和 of  k份连续子序列 属于dp,30行代码搞定,注意一些边界. substr diff:  无queu ...

  7. 【Lintcode】444. Graph Valid Tree II

    题目地址: https://www.lintcode.com/problem/444/ 要求设计一个数据结构,可以做如下两个操作: 1.void addEdge(int a, int b)在aaa与b ...

  8. 【Lintcode】125. Backpack II

    题目地址: http://www.lintcode.com/problem/backpack-ii/description 0−10-10−1背包问题,AAA表示物品体积,VVV表示物品价值,背包容量 ...

  9. 【Lintcode】1354. Pascal‘s Triangle II

    题目地址: https://www.lintcode.com/problem/pascals-triangle-ii/description 计算杨辉三角的第nnn行,从000开始计数.用两个list ...

  10. 【Lintcode】018.Subsets II

    题目: Given a list of numbers that may has duplicate numbers, return all possible subsets Notice Each ...

最新文章

  1. 项目使用了redis还需要mysql_【11-05】lnmp项目中Redis和Mysql配合使用应该注意哪些问题?...
  2. NLP免费直播 | 两周讲透图卷积神经网络、BERT、知识图谱、对话生成
  3. try-except语句与else子句联合使用处理可能出现的程序异常
  4. spark 写本地文件_(纯干货建议收藏)一次GC引发的Spark调优大全
  5. vue中button如何改变文字的大小_Vue进阶属性
  6. (转)Spring中的事务操作
  7. Huffman编码树
  8. java 使用适当的签名_java11教程--类SignatureSpi用法
  9. hibernate教程笔记9
  10. linux抓肉鸡入侵详细教程,Linux XOR.DDoS入侵排查步骤 | 聂扬帆博客
  11. 《深入浅出WPF》——命令学习
  12. 教你如何清除计算机病毒
  13. python查找列表中的重复值_在列表列表中查找重复项
  14. 免费二级域名分发企业备案域名 阿里云备案域名
  15. Windows 10 系统更新后 vagrant up 报错:Error opening VBoxDrvStub: STATUS_OBJECT_NAME_NOT_FOUND
  16. RecyclerView报错:Scrapped or attached views may not be recycled
  17. Teaching Machines to Read and Comprehend翻译
  18. 5W2H工作法,使工作更有条理,生活更好梳理
  19. C语言——字符串+转义字符+注释
  20. 1238: 盗梦空间X

热门文章

  1. word怎么在下一页添加表头_Word 文档自动添加表头的方法
  2. (三)五款常用的java开发工具(快来看看吧)
  3. Java 并发编程:轻量级锁和偏向锁详解
  4. 运放放大倍数计算公式_运放选型速记指南
  5. httpCient 的getResponseBodyAsStream instead is recommended使用方法
  6. 上班要了解的一些法律条例
  7. Error:java.lang.RuntimeException: Some file crunching failed
  8. 云计算与大数据——云计算的特点
  9. jqueryeasyui 事件方法onChange(),onSelect()
  10. 关于U盘还原安装Mac系统