LeetCode 757 题解

https://leetcode.com/problems/set-intersection-size-at-least-two/description/

题目大意:给你很多区间,求一个最小的集合,使得集合中的点至少能包括每个区间内的两个点。

解题思路:1.首先考虑区间包涵的情况,例如 [2,10] 和 [3,7] ,此时[3,7]满足的话 [2,10]肯定满足,所以区间[2,10]可以不考虑,

2.之后,贪心的考虑剩下的每个区间,尽量选每个区间的最后两个点。

class Solution {
    public int intersectionSizeTwo(int[][] intervals) {
        int n =intervals.length;
        List<Pair> li = new LinkedList<>();
        for(int i=0;i<n;i++)
        {
            li.add(new Pair(intervals[i][0],intervals[i][1]));
        }
        Collections.sort(li);
        List<Pair> list = new LinkedList<>();
        Pair pi=new Pair(li.get(n-1).s,li.get(n-1).e);
        list.add(pi);
        for(int i=n-2;i>=0;i--)
        {
            if(li.get(i).s<=pi.s && li.get(i).e>=pi.e) ;
            else
            {
                list.add(li.get(i));
                pi = li.get(i);
            }
        }
        Collections.sort(list);
        int cnt =0,a=-1,b=-1;
        for(int i=0;i<list.size();i++)
        {
            int t1 = list.get(i).s;
            int t2 = list.get(i).e;
            System.out.println(t1+" "+t2);
            System.out.println(a+" "+b);
            if(b>=t1 && b<=t2)
            {
                if(a>=t1&&a<=t2) ;
                else
                {
                    cnt++;
                    a=b;
                    b=t2;
                }
            }
            else
            {
                cnt+=2;
                a=t2-1;
                b=t2;
            }
        }
        return cnt;
    }
}

class Pair implements Comparable<Pair>{
    public int s;
    public int e;

    public Pair(int s, int e) {
        this.s = s;
        this.e = e;
    }

    @Override
    public int compareTo(Pair o) {
        if(this.s == o.s)
        {
            return o.e-this.e;
        }
        return this.s-o.s;
    }
}

此外 排序还可以用这种方法

Collections.sort(list,(a,b)->(a.s==b.s)?(b.e-a.e):(a.s-b.s));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值