数飞机
给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机?
如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权。
样例
对于每架飞机的起降时间列表:[[1,10],[2,3],[5,8],[4,7]]
, 返回3
。
解题
利用HashMap记录每个时刻的飞机数量
利用set记录时间点
最后对set 的每个时间点,找出连续时间点飞机数量和最大的那个时间段
/** * 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 if(airplanes == null || airplanes.size() == 0) return 0; HashMap<Integer,Integer> map = new HashMap<Integer,Integer>(); Set<Integer> set = new TreeSet<Integer>();// 记录此时刻的飞机数量 for(int i =0;i<airplanes.size();i++){ int s = airplanes.get(i).start; int e = airplanes.get(i).end; if(map.containsKey(s)) map.put(s,map.get(s) + 1);// 空中的飞机 + 1 else map.put(s,1); if(map.containsKey(e)) map.put(e,map.get(e) - 1);// 空中飞机 - 1 else map.put(e,-1); set.add(s);// 该时间点的飞机数 set是升序排序的 set.add(e); } Iterator it = set.iterator(); int maxAirNo = Integer.MIN_VALUE; int curcount = 0; Iterator<Integer> tmp = set.iterator(); while(tmp.hasNext()){ curcount += map.get(tmp.next()); // 从最小时间点开始找出连续最长的飞机数和 maxAirNo = Math.max(maxAirNo, curcount); } return maxAirNo; } }
改成这样的好理解点
public class Solution { /** * @param n n pairs * @return All combinations of well-formed parentheses */ public ArrayList<String> generateParenthesis(int n) { // Write your code here ArrayList<String> result = new ArrayList<String>(); if(n<=0) return result; int left = 0,right=0; String str=""; generateParenthesis(n,left,right,str,result); return result; } public void generateParenthesis(int n,int left,int right,String str ,ArrayList<String> result){ // left == n 的时候只能加右括号 if(left == n){ for(int i=0;i< n- right;i++) str+=")"; result.add(str); return; } // left >= right 左括号 右括号都可以添加 if(left>=right){ generateParenthesis(n, left+1, right,str+"(",result); // left 长度加一 generateParenthesis(n, left, right+1,str+")",result); // right 长度加一 }else // left< right 失败 return; } }