LeetCode:630. Course Schedule III - Python

189 篇文章 3 订阅
151 篇文章 2 订阅

问题描述:

630. 课程表 III

这里有 n 门不同的在线课程,他们按从1n 编号。每一门课程有一定的持续上课时间(课程时间) t 以及关闭时间第 d 天。一门课要持续学习 t 天直到第 d 天时要完成,你将会从第 1 天开始。

给出 n 个在线课程用 (t, d) 对表示。你的任务是找出最多可以修几门课。

示例:

输入: [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]
输出: 3
解释:
这里一共有 4 门课程, 但是你最多可以修 3 门:
首先, 修第一门课时, 它要耗费 100 天,你会在第 100 天完成, 在第 101 天准备下门课。
第二, 修第三门课时, 它会耗费 1000 天,所以你将在第 1100 天的时候完成它, 以及在第 1101 天开始准备下门课程。
第三, 修第二门课时, 它会耗时 200 天,所以你将会在第 1300 天时完成它。
第四门课现在不能修,因为你将会在第 3300 天完成它,这已经超出了关闭日期。

提示:

  • 整数 1 <= d, t, n <= 10,000
  • 你不能同时修两门课程。

问题分析:

题目已经提示了,贪心算法,基本思想就是,在截止日期固定的情况下,优先选择时间最短的课程。具体步骤如下:

(1)对所有课程以第二个关键词,进行排序。

(2)依次选择课程,判断这个课程添加到课程表里面是否合适?

  1. 合适,即,添加到课程表里面。
  2. 不合适,从课程表里面取出一个课程时间最长的课 与当前课程对比,如果当前长度小于它,可以替换掉。

(3)依次类推,直到结束。

Python3实现:

import heapq


class Solution:
    def scheduleCourse(self, courses):
        """
        :type courses: List[List[int]]
        :rtype: int
        """
        totalLen = 0
        heap = []
        for t, d in sorted(courses, key=lambda x: x[1]):
            if totalLen + t <= d:
                totalLen += t
                heapq.heappush(heap, -t)
            elif heap and t < -heap[0]:
                totalLen += t + heapq.heappop(heap)
                heapq.heappush(heap, -t)

        return len(heap)


if __name__ == '__main__':
    courses = [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]
    print(Solution().scheduleCourse(courses))

声明: 总结学习,有问题或不妥之处,可以批评指正哦。

题目链接:leetcode-cn.com/problems/course-schedule-iii/
参考链接:他人提交的优秀代码哦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值