zoukankan      html  css  js  c++  java
  • Merge Intervals

    Merge Intervals

    问题:

    Given a collection of intervals, merge all overlapping intervals.

    思路:

      不排序 直接上根据交集的特性

      排序后再判断

      简单的数学推导

    我的代码1:

    public class Solution {
        public List<Interval> merge(List<Interval> intervals) {
            if(intervals == null || intervals.size() == 0)  return intervals;
            for(int i = 0; i < intervals.size(); i++)
            {
                Interval interval = intervals.get(i);
                int min = interval.start;
                int max = interval.end;
                for(int j = i+1; j < intervals.size(); j++)
                {
                    Interval tmp = intervals.get(j);
                    if(isIntersect(interval, tmp))
                    {
                        intervals.remove(j);
                        j--;
                        max = Math.max(max, tmp.end);
                        min = Math.min(min, tmp.start);
                    }
                }
                if(min == interval.start && max == interval.end) i++;
                interval.start = min;
                interval.end = max;
                i--;
            }
            return intervals;
        }
        public boolean isIntersect(Interval one, Interval two)
        {
            int oneS = one.start;
            int oneE = one.end;
            int twoS = two.start;
            int twoE = two.end;
            if(oneE >= twoS && oneE <= twoE)    return true;
            if(twoE >= oneS && twoE <= oneE)    return true;
            if(oneE >= twoE && oneS <= twoS)    return true;
            if(twoE >= oneE && twoS <= oneS)    return true;
            return false;
        }
    }
    View Code

    我的代码2:

    public class Solution {
        public List<Interval> merge(List<Interval> intervals) {
            if(intervals == null || intervals.size() == 0)  return intervals;
            Collections.sort(intervals, new IntervalComparator());
            for(int i = 0; i < intervals.size() - 1; i++)
            {
                Interval one = intervals.get(i);
                Interval two = intervals.get(i+1);
                if(one.end >= two.start)
                {
                    one.end = Math.max(one.end, two.end);
                    intervals.remove(i+1);
                    i--;
                }
            }
            return intervals;
        }
        private class IntervalComparator implements Comparator<Interval>
        {
            public int compare(Interval a, Interval b)
            {
                return a.start - b.start;
            }
        }
    }
    View Code
  • 相关阅读:
    poj3068
    tyvj1864 [Poetize I]守卫者的挑战
    BZOJ1597 [Usaco2008 Mar]土地购买
    [AtCoder Regular Contest 083] Bichrome Tree
    [LUOGU]3919 【模板】可持久化数组
    [LUOGU]P3701 主席树(假的)
    2018.7.20模拟赛
    [CodeForces]1006F Xor Path
    2018.7.19模拟赛
    [LUOGU]P1373 小a和uim之大逃离
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4340345.html
Copyright © 2011-2022 走看看