zoukankan      html  css  js  c++  java
  • 281. Zigzag Iterator

    最后更新

    二刷
    11-Jan-2017

    第一种方式是各种pointer标记轮到哪个LIST,在那个LIST是什么index,比较繁琐。

    第二种方式是用Queue < List < Integer > >,每次拿出最前面的list,拿出里面的element,然后如果此时list不是空的,从屁眼塞回原来的Queue里。

    Time Complexity:
    init: O(1)
    hasNext: O(1)
    next(): O(1)

    Space: O(n)

    public class ZigzagIterator {
        
        Queue<List<Integer>> q = new LinkedList<>();
        public ZigzagIterator(List<Integer> v1, List<Integer> v2) {
            if (!v1.isEmpty()) {
                q.add(v1);
            }
            if (!v2.isEmpty()) {
                q.add(v2);
            }
        }
    
        public int next() {
            List<Integer> tempList = q.poll();
            int res = tempList.remove(0);
            if (!tempList.isEmpty()) {
                q.add(tempList);
            }
            return res;
        }
    
        public boolean hasNext() {
            return !q.isEmpty();
        }
    }
    

    follow up: K lists

    没啥变化吧。。按顺序塞屁眼,出来的时候还是这个顺序。


    一刷
    08-Oct-2017

    我是直接按K个来做的,记录总数和已读数量判断hasNext();
    一个INDEX,每次mod K得到哪个LIST,/k得到具体INDEX位置,当然如果INDEX位置超过当前LIST的长度,就看下一个LIST。。

    public class ZigzagIterator 
    {
        int total = 0;
        int cur = 0;
        int have = 0;
        List<Integer> l1;
        List<Integer> l2;
        public ZigzagIterator(List<Integer> v1, List<Integer> v2) 
        {
            total = v1.size() + v2.size();
            length = Math.max(v1.size(),v2.size())*2;
            this.l1 = v1;
            this.l2 = v2;
        }
    
        public int next() 
        {
            have++;
            while(true)
            {
                if(cur % 2 == 0)
                {
                    if(cur/2 < l1.size())
                    {
                        cur++;
                        return l1.get((cur-1)/2);
                    }
                    else cur++;
                }
                else
                {
                    if(cur/2 < l2.size())
                    {
                        cur++;
                        return l2.get((cur-1)/2);
                    }
                    else cur++;
                }
            }
    
        }
    
        public boolean hasNext() 
        {
            return (have < total);
        }
    }
    

    Discussion Board提供了用Queue的思路而不用记录INDEX的方法,其实一开始我想到都添加到一个LIST里面,但是会修改原来的LIST,毕竟要删除掉,否则还要记录每个的INDEX,就没意义了。。

    下面这个QUEUE是不需要记录INDEX的方法 ..

    public class ZigzagIterator 
    {
        Queue<List<Integer>> q = new LinkedList<List<Integer>>();
        public ZigzagIterator(List<Integer> v1, List<Integer> v2) 
        {
            if(!v1.isEmpty())
                q.add(v1);
            if(!v2.isEmpty())
                q.add(v2);
        }
    
        public int next() 
        {
            List<Integer> tempList = q.poll();
            int res = tempList.remove(0);
            if(!tempList.isEmpty()) q.add(tempList);
            return res;
    
        }
    
        public boolean hasNext() 
        {
            return (!q.isEmpty());
        }
    }
    
  • 相关阅读:
    Android的AndroidManifest.xml文件的详解
    Android新建项目手动添加Layout布局
    elasticsearch-搜索-评分(四)
    linux监控命令-磁盘监控
    linux监控命令-pidstat
    linux监控命令-free
    linux监控命令-vmstat
    redis-缓存设计-队列(普通队列、优先级队列、延迟队列)
    redis-缓存设计-信号量设计
    redis-缓存设计-搜索前缀匹配
  • 原文地址:https://www.cnblogs.com/reboot329/p/5944471.html
Copyright © 2011-2022 走看看