Lintcode:1242. Non-overlapping Intervals

描述

Given a collection of intervals, find the minimum number of intervals you need to remove to make the rest of the intervals non-overlapping.

个人思路:既然要求最少移出,那么可以确定的贪心策略就是如果发生冲突,那么移出区间更长的interval,所以先排序,如果start相同,移出end更大的那个interval;另一种情况也是这样

public int eraseOverlapIntervals(List<Interval> intervals) {
        Collections.sort(intervals, new Comparator<Interval>() {
            @Override
            public int compare(Interval o1, Interval o2) {
                return (o1.start == o2.start)?(o1.end-o2.end):(o1.start-o2.start);
            }
        });
        
        int size = intervals.size();
        for (int i = 1; i < intervals.size(); ) {
            if (intervals.get(i).start == intervals.get(i-1).start) {
                intervals.remove(i);
              
                continue;
            }

            if (intervals.get(i).start < intervals.get(i-1).end){
                if (intervals.get(i).end > intervals.get(i-1).end)
                    intervals.remove(i);
                else
                    intervals.remove(i-1);
            
                continue;
            }
            
            i++;

        }

        return size-intervals.size();
    }

dalao思路:其实思路差不多,但dalao的做法更简洁,值得学习

 public int eraseOverlapIntervals(List<Interval> intervals) {
    Collections.sort(intervals, IntervalComp.COMP);
    int res = 0;
    int lastright = Integer.MIN_VALUE;
    for (Interval i : intervals)
      if (i.start >= lastright) {
        lastright = i.end;
      } else {
        res++;
        lastright = Math.min(lastright, i.end);
      }
    return res;
  }

summary:1、总是先选取当前对情况最优的个体处理

2、使用一个变量,避免list.remove操作(其实完全不知道怎么描述summary,先放着。。。。)

猜你喜欢

转载自blog.csdn.net/qq_38702697/article/details/82820043
今日推荐