zoukankan      html  css  js  c++  java
  • 352. Data Stream as Disjoint Interval

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen so far as a list of disjoint intervals.

    For example, suppose the integers from the data stream are 1, 3, 7, 2, 6, ..., then the summary will be:

    [1, 1]
    [1, 1], [3, 3]
    [1, 1], [3, 3], [7, 7]
    [1, 3], [7, 7]
    [1, 3], [6, 7]
    

    Follow up:
    What if there are lots of merges and the number of disjoint intervals are small compared to the data stream's size?

     本题考查TreeMap,这里区别一下。TreeMap可以检查某一个key值和它相临的比它大一点和比它小一点的key值,还可以用containsKey来检查是否包含该元素。检查的方法分别是lowerKey和higherKey。而TreeSet里面有ceiling和flooring两种方法,分别表示大于等于它和小于等于它的值。本题的key值为Interval里面的start值,value值为Interval。然后进行详细的判断即可。

    /**

     * Definition for an interval.

     * public class Interval {

     *     int start;

     *     int end;

     *     Interval() { start = 0; end = 0; }

     *     Interval(int s, int e) { start = s; end = e; }

     * }

     */

    public class SummaryRanges {

        TreeMap<Integer,Interval> map;

        /** Initialize your data structure here. */

        public SummaryRanges() {

            map = new TreeMap<Integer,Interval>();

        }

        

        public void addNum(int val) {

            if(map.containsKey(val)) return;

            Integer lo = map.lowerKey(val);

            Integer hi = map.higherKey(val);

            if(lo!=null&&hi!=null&&map.get(lo).end+1==val&&hi==val+1){

                map.get(lo).end = map.get(hi).end;

                map.remove(hi);

            }else if(lo!=null&&map.get(lo).end+1>=val){

                map.get(lo).end = Math.max(val,map.get(lo).end);

            }else if(hi!=null&&hi==val+1){

                map.put(val,new Interval(val,map.get(hi).end));

                map.remove(hi);

            }else{

                map.put(val,new Interval(val,val));

            }

        }

        

        public List<Interval> getIntervals() {

            return new ArrayList<Interval>(map.values());

        }

    }

     

    /**

     * Your SummaryRanges object will be instantiated and called as such:

     * SummaryRanges obj = new SummaryRanges();

     * obj.addNum(val);

     * List<Interval> param_2 = obj.getIntervals();

     */

  • 相关阅读:
    各种小知识
    基础技能
    st表
    有理数取余
    FFT加速高精度乘法
    unique
    离散化
    线段树复杂度分析
    楼房重建
    电脑装系统常用方法
  • 原文地址:https://www.cnblogs.com/codeskiller/p/6361168.html
Copyright © 2011-2022 走看看