贪心思想?重写比较函数排序

本文介绍通过排序算法解决两个典型问题的方法:一是如何找到需要移除的最少区间数量,使剩余区间不重叠;二是如何根据身高和队伍前的高人数量重建队伍。文章详细解释了排序逻辑及其在实际问题中的应用。

有一类题,有人说是属于贪心,有人说是属于排序,题目看似复杂,但是通过对二维数组进行排序,就可以直接KO,反正不纠结于分类,话不多说,开始看题。

435.无重叠区间
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

排序逻辑:安排下尽可能多的区间,就是要使区间右端点尽可能小,按右端点从小到大的顺序排序,然后从第一个开始找不重叠的区间个数

 public static int eraseOverlapIntervals(int[][] intervals) {
        if(intervals.length <= 1)
            return 0;
        Arrays.sort(intervals, new Comparator<int[]>(){
            public int compare(int []a, int[]b){
                return a[1] - b[1];
            }
        });
        int num = 1;
        int pre = 0, next = 1;
        while(next < intervals.length){
            if(intervals[pre][1] <= intervals[next][0]){
                pre = next;
                next++;
                num++;
            }
            else{
                next++;
            }
        }
        return intervals.length - num;
    }

406.根据身高重建队列难度中等411假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

排序逻辑:首先可以确定k是按照从小到大的顺序来排,然后由于后面还要对人添加到队列中,要先添加高的人,所以身高要从大到小排序,并且身高为第一排序标准。

 public int[][] reconstructQueue(int[][] people) {
        Arrays.sort(people, new Comparator<int[]>(){
            public int compare(int[]a, int[]b){
                if(a[0] == b[0]){
                    return a[1] - b[1];
                }
                else return b[0] - a[0];
            }
        });
        List<int[]>list = new LinkedList<>();
        for(int i = 0; i < people.length; i++){
            list.add(people[i][1], people[i]);
        }
        return list.toArray(new int[people.length][2]);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值