贪心算法区间合并

给定 nn 个区间 [li,ri][li,ri],要求合并所有有交集的区间。

注意如果在端点处相交,也算有交集。

输出合并完成后的区间个数。

例如:[1,3][1,3] 和 [2,6][2,6] 可以合并为一个区间 [1,6][1,6]。

输入格式

第一行包含整数 nn。

接下来 nn 行,每行包含两个整数 ll 和 rr。

输出格式

共一行,包含一个整数,表示合并区间完成后的区间个数。

数据范围

1≤n≤1000001≤n≤100000,
−109≤li≤ri≤109−109≤li≤ri≤109

输入样例:

5
1 2
2 4
5 6
7 8
7 9

输出样例:

3

 本题为经典贪心算法,求区间合并问题主要分为三步:

1.将区间按照区间左端点大小依次排序

2.将区间扫描,并根据扫描区间大小关系将区间进行合并(区间值之间大小关系,分为三种,主要根据如下代码)

import java.util.*;

@SuppressWarnings("all")
public class Main{
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        ArrayList<Pair> arrayList = new ArrayList<>();
        int x,y;
        for(int i = 0; i < n ; i++){
           x = scanner.nextInt();
           y = scanner.nextInt();
           arrayList.add(new Pair(x, y));
        } 
        ArrayList<Pair> arrayList1 = merge(arrayList);
        System.out.println(arrayList1.size());
    }

    public static <T> ArrayList<Pair> merge(ArrayList<Pair> arrayList){
        int first = (int)(-2 * Math.pow(10, 9)),second = (int)(-2 * Math.pow(10, 9));
        arrayList.sort(new Comparator<Pair>() {

            @Override
            public int compare(Pair o1, Pair o2) {
                if(o1.first > o2.first){
                    return 1;
                }
                return -1;
            }
            
        });
        ArrayList<Pair> arrayList2 = new ArrayList<>();
        //进行遍历查找
        for(Pair pair : arrayList){
            if(pair.first > second){
                if(second != -2 * Math.pow(10, 9)){
                    arrayList2.add(new Pair(first, second));
                }
                first = pair.first;
                second = pair.second;
            }else{
                second = Math.max(second, pair.second);
            }
        }
        if(second != -2 * Math.pow(10, 9)){
            arrayList2.add(new Pair(first, second));
        }
        return arrayList2;
    }
}

class Pair{
    int first,second;
    
    public Pair(int first,int second){
        this.first = first;
        this.second = second;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值