数据结构与算法-贪心算法

贪心算法的套路:一定会有一个排序。哈夫曼编码,贪心算法,压缩算法。最短路径
贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。

贪心算法其最重要的两个点就是:
贪心策略:排序
通过局部最优解能够得到全局最优解
一般通过以下问题就可以通过贪心算法解决:
1.针对某个问题有限制值,以及有一个期望的最好结果,通常是从某些数据中选出其中一些,达到最好的结果。
2.一般会有一个排序,找出贡献最大的。
3.举例看贪心是否可以解决。
一般用在任务调度,教师排课等系统。
实际上,用贪心算法解决问题的思路,并不总能给出最优解,比如来看下一个问题:

package edu.sort;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 贪心算法
 * 贪心算法又称贪婪算法,它在求解问题时,总是做出眼前利益最大化
 * 也就说只顾眼前不顾大局,所以他是局部最优解。
 * 核心:通过局部最优,推出全局最优
 * 场景:
 * 1,N个会议室,N个会议,如何保证会议室利用率最大化
 * 2,购物消费券,如何能够最大可能的利用优惠券,如淘宝的300
 * 3,最短路径
 * 4,最高效使用
 * 5,任务调度
 * 6,教师排课系统
 * <p>
 * 能够使用贪心算法的场景一般有以下场景
 * 1,针对某个问题有限制值,以及有一个期望的最好结果,通常是从某些数据中选出其中一些,达到最好的结果。
 * 2,一般会有一个排序,找出最优解
 * 3,举例贪心算法是否可以解决
 * <p>
 * 实际上贪心算法,并不总能给出最优解
 *
 * @author: LHT
 * @date: 2020/12/21 19:38
 */
public class GreedyAlgorithm {
    /**
     * 举例会议室时间安排
     */

    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        List<Meeting> meetings = new ArrayList<Meeting>();
        int n = cin.nextInt();    //n个会议
        for (int i = 0; i < n; i++) {
            int start = cin.nextInt();
            int end = cin.nextInt();
            Meeting meeting = new Meeting(i + 1, start, end);
            meetings.add(meeting);
        }

        meetings.sort(null);
        int curTime = 0;        //当前的时间,从一天的0点开始,如果领导要求从8点开始 那curTime=8
        for (int i = 0; i < n; i++) {
            Meeting meeting = meetings.get(i);
            if (meeting.startTime >= curTime) {        //会议的开始时间比我们当前的要大 表示可以开
                System.out.println(meeting.toString());
                curTime = meeting.endTime;
            }
        }
    }
}

class Meeting implements Comparable<Meeting> {

    int meNum; // 编号
    int startTime; // 开始时间
    int endTime; // 结束时间

    public Meeting(int meNum, int startTime, int endTime) {
        super();
        this.meNum = meNum;
        this.startTime = startTime;
        this.endTime = endTime;
    }

    public int compareTo(Meeting o) {
        if (this.endTime > o.endTime)
            return 1;
        return -1;
    }

    @Override
    public String toString() {
        return "Meeting [meNum=" + meNum + ", startTime=" + startTime
                + ", endTime=" + endTime + "]";
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值