• lintcode:数飞机


    数飞机

    给出飞机的起飞和降落时间的列表,用 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;
        }
    }
  • 相关阅读:
    [leedcode 46] Permutations
    [leedcode 45] Jump Game II
    [leedcode 43] Multiply Strings
    [leedcode 42] Trapping Rain Water
    [leedcode 41] First Missing Positive
    [leedcode 40] Combination Sum II
    全排列
    [leedcode 39] Combination Sum
    [leedcode 38] Count and Say
    调和级数求和(分块)
  • 原文地址:https://www.cnblogs.com/bbbblog/p/5349488.html
Copyright © 2020-2023  润新知