ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Leetcode 630 课程表 III

2021-12-14 17:05:04  阅读:169  来源: 互联网

标签:630 学习 int nowTime queue courses 课程 课程表 III


题目

这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。

你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。

返回你最多可以修读的课程数目。

解题思路

  反悔贪心。贪心策略为,在尽可能短的时间内学习最多的课,对于学习相同数目的课,需要消耗的时间尽可能的少。

  首先是 在尽可能短的时间内学最多的课 ,需要对所有可能的截止时间进行升序排序,对于截止时间一样的课对课程时长进行升序排序。维护一个 nowTime 表示当前已经选择可能的总时长,如果 nowTime + courses[i][0] <= courses[i][1] 表示当前课程可以学习。

  然后对于 学习相同数目的课,需要消耗的时间尽可能的少 ,如果遇到的课程当前可能无法学习,但在已经选择的课程中,如果存在课程时长比当前遇到的课程时长要长的,说明选择当前课程更优,因为更长的截止时间内能学习一样的课程数量而且学习的总时间更短。那么就需要我们维护一个优先队列,把已经选择的课程中最长的课程时长置于队首,便于判断。具体见代码。

代码

class Solution {
    public int scheduleCourse(int[][] courses) {
        Arrays.sort(courses, (a, b) -> {
            if (a[1] == b[1]) return a[0] - b[0];
            else return a[1] - b[1];
        });

        int nowTime = 0, length = courses.length;
        PriorityQueue<Integer> queue = new PriorityQueue<>((a, b) -> b - a);
        for (int i = 0; i < length; i++) {
            if (nowTime + courses[i][0] <= courses[i][1]) {
                nowTime += courses[i][0];
                queue.add(courses[i][0]);
            } else if (!queue.isEmpty() && courses[i][0] < queue.peek()) {
                nowTime -= queue.poll();
                nowTime += courses[i][0];
                queue.add(courses[i][0]);
            }
        }
        return queue.size();
    }
}

标签:630,学习,int,nowTime,queue,courses,课程,课程表,III
来源: https://blog.csdn.net/qq_36258516/article/details/121931257

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有