贪心算法学习,例题:区间贪心
区间贪心:
有N个开区间,从中选出尽可能多的开区间,使得这些开区间两两没有交集
输入:输入一个数字N,然后输入N个开区间
输出:选了多少个开区间,以及这些开区间分别是什么
思路:
代码:
package tanxin;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
//自定义一个类,用于存放一个区间,left为左边的值,right为右边的值
class Inteval{
int left;
int right;
//重写tostring方法用于输出结果
public String toString(){
return this.left+","+this.right;
}
};
//自定义一个类,实现Comparator接口
class cmp implements Comparator<Inteval>{
//重写排序的compare方法,当o1<o2时,return 1为降序,反之则是升序
public int compare(Inteval o1, Inteval o2) {
if(o1.left!=o2.left){
return o1.left<o2.left?1:-1; //按照left降序排列
}else{
return o1.right<o2.right?-1:1; //如果left相同,按right升序来排
}
}
};
public class qujian {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
//创建自定义类Inteval类型的一个数组
Inteval []intevals = new Inteval[num];
for(int i=0;i<num;i++){
int left = scanner.nextInt();
int right = scanner.nextInt();
//自定义类的数组在使用时一定要先创建这个对象
intevals[i] = new Inteval();
intevals[i].left=left;
intevals[i].right=right;
};
Arrays.sort(intevals,new cmp());
int ars=1; //用于记录用了几个区间,必有一个所以默认1
int lastX=intevals[0].left; //记录每一个选中区间的left值,默认为第一个区间
List<Integer> list = new ArrayList<Integer>();//用于记录被选中的区间是哪些
for(int i=1;i<intevals.length;i++){
if(intevals[i].right<=lastX){
ars++;
lastX=intevals[i].left; //将lastX重置为当前选中区间的left值
list.add(i);//这是intevals数组中的第i个区间,将i存入list中
}
};
System.out.println("用了几个区间:");
System.out.println(ars);
System.out.println("分别是:");
System.out.print(intevals[0]+" ");
for(int i=0;i<list.size();i++){
int xh = list.get(i);
System.out.print(intevals[xh].toString()+" ");
}
}
}
运行结果: