LeetCode435. 无重叠区间

LeetCode上提交 执行时间优于100%的提交记录

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意:

  1. 可以认为区间的终点总是大于它的起点。
  2. 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

示例 1:

输入: [ [1,2], [2,3], [3,4], [1,3] ]

输出: 1

解释: 移除 [1,3] 后,剩下的区间没有重叠。

示例 2:

输入: [ [1,2], [1,2], [1,2] ]

输出: 2

解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

示例 3:

输入: [ [1,2], [2,3] ]

输出: 0

解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

思路:每个区间当作一个对象,区间对象 元素保存在 intervals[] 数组种

1)先对区间对象进行排序

2)对相邻的两个区间对象元素进行 取舍/合并 判断

  • 如果前面区间的右边界小于或等于后面区间的左边界,不需要合并;如:[1,3] 和 [3,4]
  • 如果前面区间的右边界大于后面区间的左边界 且小于后面区间的右边界,舍掉后面的区间;如:[1,3]和[2,4],舍去[2,4]
  • 如果前面区间的右边界大于后面区间的右边界,舍掉前面的区间;如:[1,5]和[2,4],舍去[1,5]

下面放上源代码:

package Algorithm.LeetCode;

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;


class Interval{
    int start;
    int end;
    Interval() { start = 0; end = 0; }
    Interval(int s, int e) { start = s; end = e; }
}

public class Solution12 {
    public static int eraseOverlapIntervals(Interval[] intervals) {
        Arrays.sort(intervals, new Comparator<Interval>() {
            @Override
            public int compare(Interval o1, Interval o2) {
                if(o1.start==o2.start) {
                    return o1.end-o2.end;
                }
                return o1.start-o2.start;
            }
        });

//        for (Interval obj:intervals) {
//            System.out.println(obj.start+","+obj.end);
//        }
        int sum = 0;
        int next = 1;
        for(int i = 0;i<intervals.length-1;){
            //System.out.println("i="+i);
            if(i+next>=intervals.length)
                break;
            if(intervals[i]!=null){
                if(intervals[i].end<=intervals[i+next].start){
                    intervals[i].end = intervals[i+next].end;
                    i++;
                    next=1;
                }
                //删除后面一个,i不变
                else if(intervals[i].end>intervals[i+next].start&&intervals[i].end<intervals[i+next].end){
                    intervals[i+next]=null;
                    next++;
                    sum++;
                    //System.out.println("sum="+sum);
                }
                else{//删除当前
                    intervals[i]=null;
                    i++;
                    next=1;
                    sum++;
                    //System.out.println("sum="+sum);
                }
            }
            //节点为空,访问下一个节点
            else {
                i++;
                next=1;
            }
        }
        return sum;
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str=sc.nextLine();
        String []str1=str.split(" ");
        int len = str1.length;
        int[] a = new int[len];
        for(int i = 0 ;i < len ; i ++){
            a[i] = Integer.valueOf(str1[i]);
        }
        Interval[] b = new Interval[len/2];
        for(int i = 0,j=0 ;i<len/2;i++){
            Interval obj = new Interval(a[j],a[j+1]);
            b[i] = obj;
            //System.out.println("i="+i+","+"j="+j);
            j+=2;
        }

        System.out.println(eraseOverlapIntervals(b));


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值