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));