http://www.lintcode.com/en/problem/number-of-airplanes-in-the-sky/#
给出起降时间,判断最多有多少飞机同时在天上
解法一:
HashMap,内外循环,内层循环当前飞机的start ~ end,将当前时刻的飞机数+1
/** * Definition of Interval: * public classs Interval { * int start, end; * Interval(int start, int end) { * this.start = start; * this.end = end; * } */ class Solution { /** * @param intervals: An interval array * @return: Count of airplanes are in the sky. */ public int countOfAirplanes(List<Interval> airplanes) { // write your code here HashMap<Integer, Integer> map = new HashMap(); int max = 0; for (Interval i : airplanes) { int start = i.start; int end = i.end; for (int j = start; j < end; j++) { if (map.containsKey(j)) { map.put(j, map.get(j) + 1); } else { map.put(j, 1); } max = Math.max(max, map.get(j)); } } return max; } }
解法二:
扫描线
定义一个类,遇到start就sum加一,遇到end就sum减一,update sum和max
/** * Definition of Interval: * public classs Interval { * int start, end; * Interval(int start, int end) { * this.start = start; * this.end = end; * } */ class Solution { /** * @param intervals: An interval array * @return: Count of airplanes are in the sky. */ public int countOfAirplanes(List<Interval> airplanes) { // write your code here ArrayList<Point> list = new ArrayList(airplanes.size() * 2); for (Interval i : airplanes) { list.add(new Point(i.start, 1)); list.add(new Point(i.end, -1)); } Collections.sort(list, new Comparator<Point>() { public int compare(Point i1, Point i2) { if (i1.time == i2.time) { return i1.delta - i2.delta; } else { return i1.time - i2.time; } } }); int max = 0; int sum = 0; for (Point p : list) { sum += p.delta; max = Math.max(max, sum); } return max; } } class Point { int time; int delta; public Point(int time, int delta) { this.time = time; this.delta = delta; } }