贪心算法-选择不相交区间问题

解法一

按照左区间排序

import java.util.*;
public class Zuidabuxiangjiaoshu2 {
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int n=in.nextInt();
            List list=new ArrayList<Point>();
            for(int i=0;i<n;i++){
                int tstart=in.nextInt();
                int tend=in.nextInt();
                list.add(new Point(tstart,tend));
            }
            //按照start(左区间)排序
            Collections.sort(list, new Comparator<Point>() {
                public int compare(Point o1,Point o2){
                    return o1.start-o2.start;
                }
            });
            Point temp1=(Point)list.get(0);
            int cnt=1;
            int end1=temp1.end;
            //贪心策略
            for(int i=1;i<n;i++){
                Point temp2=(Point)list.get(i);
                if(end1>temp2.end)
                    end1=temp2.end;
                if(end1<=temp2.start){
                    cnt++;
                    end1=temp2.end;
                }
            }
            System.out.println(cnt);
        }
    }
}
//定义数据结构
class Point1{
    int start;
    int end;
    Point1(int start,int end){
        this.start=start;
        this.end=end;
    }
}

解法二

import java.util.*;
public class Zuidaqujianshu {
    public static void main(String args[]){
        Scanner in=new Scanner(System.in);
        while(in.hasNext()){
            int n=in.nextInt();
            List list=new ArrayList<Point>();
            for(int i=0;i<n;i++){
                int tstart=in.nextInt();
                int tend=in.nextInt();
                list.add(new Point(tstart,tend));
            }
            //按照end从小到大排序
            Collections.sort(list, new Comparator<Point>() {
                public int compare(Point o1,Point o2){
                    return o1.end-o2.end;
                }
            });
            //贪心策略
           Point temp1=(Point)list.get(0);
           int cnt=1;
           int end1=temp1.end;
           for(int i=1;i<n;i++){
               Point temp2=(Point)list.get(i);
               if(end1<=temp2.start){
                   cnt++;
                   end1=temp2.end;
               }
           }
           System.out.println(cnt);
        }
    }
}
//定义数据结构
class Point{
    int start;
    int end;
    Point(int start,int end){
        this.start=start;
        this.end=end;
    }
}

猜你喜欢

转载自blog.csdn.net/anhuibozhoushatu/article/details/83543070
今日推荐