Java算法学习——贪心法
作者:互联网
一、简单贪心
当题目中让我们最优的情况时,比如效益最大,组成的数最大等等,此时我们要想到贪心算法的思想。简单来说就是先去考虑局部最优,然后由局部最优组成全局的最优。比如,当求效益最大时,要达到效益最大,说明每个单独的个体的效益最大,所以我们可以先去求单价效益最大的情况开始;组成的数最大,那么就说明,每一个位放的数要最小,这也是局部最优,最后组成的数就是最小,达到了全局最优。
二、区间贪心(区间不相交问题与区间选点问题)
1.区间不相交问题
**(1)问题描述:**给出N个开区间,从中选择尽可能多的开区间,使得这些开区间两两没有交集
(2)解决问题的步骤:
①先定义一个结构体数组将区间全部存入
②对区间进行排序:按照左端点从大到小排序,如果左端点相同,则按照右端点从小到大排序
②然后遍历排好序的区间数组,选择第一个区间为标准,从第二个区间开始,如果该区间的右端点在选定的标准区间的左端点的左边,则更新标准区间为它,然后不相交的区间的数量+1
(3)代码如下:
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
class Inteval {
public int left,right;
Inteval(int a,int b) {
this.left = a;
this.right = b;
}
}
class cmp implements Comparator<Inteval>{
@Override
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;//按照right升序排序
}
}
}
public class Test {
public static void main(String []args){
int n;
Scanner cin=new Scanner(System.in);
n=cin.nextInt();
Inteval []I=new Inteval[n+1];
for(int i=0;i<n;i++){
int left=cin.nextInt();
int right=cin.nextInt();
I[i]=new Inteval(left,right);//太容易错了,要先给数组中的每一个元素开辟一个空间,否则都是空的
}
Arrays.sort(I,0,n, new cmp());
for(int i=0;i<n;i++){
System.out.println(I[i].left+" "+I[i].right);
}
//ans用来记录不相关的区间的个数,lastX用来记录上一个被选中区间的左端点
int ans=1,lastX=I[0].left;
for(int i=1;i<n;i++){
if(I[i].right<=lastX){
ans++;
lastX=I[i].left;
}
}
System.out.println(ans);
}
}
标签:right,Java,Inteval,int,算法,端点,区间,贪心,left 来源: https://blog.csdn.net/Warddamn/article/details/114552064