Merge interval series:

  • for (int i = 1; ) not 0
  • use last = intervals[0]

number of airplanes in the sky

  • turn on and turn off, then count total turned-on
  • be careful the comparator, when interval time equals, flag off comes first then flag on
class Point {
    int time;
    int flag;

    Point(int time, int flag) {
        this.time = time;
        this.flag = flag;
    }
}

class Solution {
    public int countOfAirplanes(List<Interval> airplanes) { 
        List<Point> list = new ArrayList<>();
        for (Interval interval : airplanes) {
            list.add(new Point(interval.start, 1));
            list.add(new Point(interval.end, 0));
        }

        Collections.sort(list, (p1, p2) -> {
            if (p1.time != p2.time) {
                return p1.time - p2.time;
            } else {
                return p1.flag - p2.flag;
            }
        });

        int ans = 0;
        int count = 0;

        for (Point p : list) {
            if (p.flag == 1) 
                count++;
            else
                count--;
            ans = Math.max(ans, count);
        }
        return ans;
    }
}

build outline

??

merge interval

//?? use bitset??

class Solution {
    public List<Interval> merge(List<Interval> intervals) {

        if (intervals.size() <= 1) return intervals;

        List<Interval> rst = new ArrayList<>();

        intervals.sort((i1, i2) -> Integer.compare(i1.start, i2.start));

        int start = intervals.get(0).start;
        int end = intervals.get(0).end;

        // 1. disjoint: add and reset bound
        // 2. overlapping: merge 
        for (Interval interval : intervals) {            
            if (end < interval.start) {
                rst.add(new Interval(start, end));
                start = interval.start;
                end = interval.end;                
            } else {
                //start = Math.min(interval.start, start);
                end = Math.max(interval.end, end);
            }
        }        
        rst.add(new Interval(start, end));

        return rst;        
    }
}

insert interval

public class Solution {
    public List<Interval> insert(List<Interval> intervals, Interval newInterval) {

        if (intervals == null || newInterval == null) {
            return intervals;
        }

        ArrayList<Interval> result = new ArrayList<>();
        int start = newInterval.start;
        int end = newInterval.end;

        // treat newInsert as starting point
        // one more case to consider comparing to Merge Interval:
        // curr interval happens before starting point (newInsert)
        for (Interval interval : intervals) {
            if (interval.end < start) {
                result.add(interval);
            } else if (end < interval.start) {
                result.add(new Interval(start, end));
                start = interval.start;
                end = interval.end;                
            } else {
                start = Math.min(interval.start, start);
                end = Math.max(interval.end, end);
            }                     
        }

        result.add(new Interval(start, end));
        return result;
    }        
}

results matching ""

    No results matching ""