数据结构和算法之六:贪婪和动规算法

算法理论之贪婪算法和动态规划

本篇文章,简单的介绍一下贪婪算法和动态规划,因本人是算法渣渣,因此权当大家看个热闹。

贪婪算法

一个简单的问题:公司有N个同等级的会议需要使用同一个会议室,现在给你这个N个会议的开始和结束

时间,你怎么样安排才能使安排最多场次的会议?

大家先花两分钟,脑海里面梳理一下解题思路。

思路1:优先安排会议时间最短的能不能行?

比如时间是8-12点,会议1是9点半到10点半(1个小时),会议2从8点到10点(2个小时),会议3从10点到11点30分(1.5个小时),此时如果优先安排最短的会议,你会发现只能安排一场(会议1),但实际上会议2和会议3也能安排下去。

在这里插入图片描述

思路2:优先安排最早开始的会议能不能行?

这个我想相信不用举例子你就能明白,肯定是不得行的。

思路3:优先安排会议结束时间最早的能不能行?

优先安排会议结束时间最早的,那么首先将所有会议按照结束时间排序,结束时间越早的约优先安排,这样我不管以后还能不能安排会议,我只管越早结束,留下的时间就越多,能安排的会议就越多。这种是可行的,你可以多举例来证明。

我们用代码实现这个会议调度功能:

/**
 * 会议调度问题
 *
 * 有一会议室,可接受早上8点到晚上6点这个时间段的会议,现有若干场会议需要召开
 * 问,如何安排会议才能让召开的会议场次最多?
 *
 * 贪心算法,局部最优解推导出全局最优。
 *  特点:在一定的限制中,求最值。
 *  套路:一定有个一排序
 *
 *
 * 解决思路:
 *  如果先召开最早结束的会议,那么剩下的时间也就越多,能够召开的会议也就越多。
 *  这样将会议进行排序,结束时间从小到大排序。
 *
 */
public class MeetingSchdule {
   

    public static void  schedule(List<Meeting> meetings, int minTime, int maxTime){
   
        if (meetings==null || meetings.isEmpty()) {
   
            return;
        }
        //结束时间从小到大排序
        meetings.sort((o1, o2) -> o1.endTime > o2.endTime ? 1 : -1);

        final int[] curIdleBeginTime = {
   minTime};  //当前会议室空闲的开始时间点
        meetings.forEach(meeting -> {
   
            if(meeting.startTime >= curIdleBeginTime[0]){
   
                System.out.println("举行会议:"+meeting);
                curIdleBeginTime[0] = meeting.endTime;
            }
        });

    }


    public static void main(String[] args) {
   
        List<Meeting> meetings = new ArrayList<>();
        meetings.add(new Meeting(1, 8,9));
        meetings.add(new Meeting(2, 9,10));
        meetings.add(new Meeting(4, 9,11));
        meetings.add(new Meeting(5, 11,12)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值