• 合并区间


    // 输入: [[1,3],[2,6],[8,10],[15,18]]

    // 输出: [[1,6],[8,10],[15,18]]
    // 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6]

    /**
        * 思路:
        * 第一步,先按照start的大小将intervals排序。
        * 第二步,合并区间,先取出第一个区间,再取出紧挨着的区间,判断两个区间可以合并么,
        * 合并的条件是后一个区间的start要小于等于前一个区间的end,根据后一个区间的end值是否小于前一个区间的end值,
        * 确定合并后的区间,一直循环遍历完集合
     *
     */
    public class TTT {
    
    
        public static void main(String[] args) {
            Interval i1 = new Interval(1, 3);
            Interval i2 = new Interval(2, 6);
            Interval i3 = new Interval(8, 10);
            Interval i4 = new Interval(15, 18);
            List<Interval> intervals =  new ArrayList<>();
            intervals.add(i1);
            intervals.add(i2);
            intervals.add(i3);
            intervals.add(i4);
            List<Interval> res = merge(intervals);
            System.out.println("#####");
        }
        
        public static List<Interval> merge(List<Interval> intervals) {
            //1.先按照start排序
            Collections.sort(intervals, new Comparator<Interval>() {
                @Override
                public int compare(Interval o1, Interval o2) {
                    return  o1.start - o2.start;
                }
            });
            List<Interval> res = new ArrayList<Interval>();
            int len = intervals.size();
            int pos = 0;
            while(pos <= len-1){
                int start = intervals.get(pos).start;
                int end = intervals.get(pos).end;
                int j = pos+1;
                //2.下一个元素可以合并就合并,不能合并就添加到res中并且跳到下一个元素
                while( j<= len-1 && intervals.get(j).start <= end){
                    if(end < intervals.get(j).end){
                        end = intervals.get(j).end;
                    }
                    j++;
                }
                res.add(new Interval(start,end));
                pos = j;
            }
            return res;
        }
        
        static class Interval {
               int start;
               int end;
               Interval() { start = 0; end = 0; }
               Interval(int s, int e) { start = s; end = e; }
         }
    }
  • 相关阅读:
    shell lab
    cache lab
    后缀树
    leetcode maximum-length-of-repeated-subarray/submissions
    leetcode assign-cookies
    lcs
    leetcode delete-operation-for-two-strings
    【C】C语言typedef
    【C】C语言结构体指针的语法
    【JAVA】Java 命令行参数解析
  • 原文地址:https://www.cnblogs.com/moris5013/p/11065494.html
Copyright © 2020-2023  润新知