编程语言
首页 > 编程语言> > Java算法学习——贪心法

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