美文网首页
「算法」630. 课程表 III

「算法」630. 课程表 III

作者: MrLiuYS | 来源:发表于2021-12-14 10:03 被阅读0次
image
这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。

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

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

 

示例 1:

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

输入:courses = [[1,2]]
输出:1
示例 3:

输入:courses = [[3,2],[4,3]]
输出:0
 

提示:

1 <= courses.length <= 104
1 <= durationi, lastDayi <= 104

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/course-schedule-iii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解

image

Swift

class Solution {
    func scheduleCourse(_ courses: [[Int]]) -> Int {
        let courseSorts = courses.sorted { $0.last! < $1.last! }

        // 总课程时间
        var total = 0

        var queue = [Int]()

        for cource in courseSorts {
            let ti = cource[0], di = cource[1]

            if total + ti <= di {
                total += ti
                queue.append(ti)
                queue.sort(by: <)

            } else if !queue.isEmpty, queue.last! > ti {
                total = total - queue.last! + ti

                queue.removeLast()

                queue.append(ti)

                queue.sort(by: <)
            }
        }

        return queue.count
    }
}

print(Solution().scheduleCourse([[7,17],[3,12],[10,20],[9,10],[5,20],[10,19],[4,18]]))
// print(Solution().scheduleCourse([[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]))

// print(Solution().scheduleCourse([[1, 2]]))
// print(Solution().scheduleCourse([[3, 2], [4, 3]]))
//
// print(Solution().scheduleCourse([[5, 5], [4, 6], [2, 6]]))

Dart

class Solution {
  int scheduleCourse(List<List<int>> courses) {
    courses.sort((List<int> a, List<int> b) {
      return a.last.compareTo(b.last);
    });

    print(courses);

    // 总课程时间
    var total = 0;

    var queue = <int>[];

    for (var cource in courses) {
      var ti = cource[0], di = cource[1];

      if (total + ti <= di) {
        total += ti;
        queue.add(ti);

        queue.sort();
      } else if (queue.isNotEmpty && queue.last > ti) {
        total = total - queue.last + ti;

        queue.removeLast();

        queue.add(ti);

        queue.sort();
      }
    }

    return queue.length;
  }
}

void main() {
  print(Solution().scheduleCourse([
    [7, 17],
    [3, 12],
    [10, 20],
    [9, 10],
    [5, 20],
    [10, 19],
    [4, 18]
  ]));
}

相关文章

  • 「算法」630. 课程表 III

    题解 Swift Dart

  • 8.27 - hard - 110

    630. Course Schedule III 现排序,再用heap,很多greedy的问题都可以这样来做。基本...

  • 课程表 III

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/course...

  • 算法笔记之优先队列——课程表 III

    优先队列(堆)的经典应用,记录一下。 题目描述 LeetCode.630. 课程表 III[https://lee...

  • 算法时间 III

    1. 有效的字母异位词[https://leetcode.cn/problems/valid-anagram/] ...

  • 《算法图解》笔记 iii

    迪克斯特拉算法 在图中,搜索最小的“段”数可以用广度优先算法,这就相当于默认每条边的权重是相同的,如果每条边的权重...

  • 77. 组合/207. 课程表

    77. 组合 相关标签:回溯算法 207. 课程表 相关标签: DFS BFS 图 拓扑排序

  • Java 算法 - Single Number III

    题意 样例 1. 解题思路   相信大家做过其他类似的题,就是从很多数中找出其中一个只出现过一次的数字,这种题的解...

  • 算法—— 最近公共祖先 III

    给一棵二叉树和二叉树中的两个节点,找到这两个节点的最近公共祖先LCA。两个节点的最近公共祖先,是指两个节点的所有父...

  • 小争哥算法题打卡记录

    第十周算法题 1、437. 路径总和 III 2、| 889. 根据前序和后序遍历构造二叉树[https://le...

网友评论

      本文标题:「算法」630. 课程表 III

      本文链接:https://www.haomeiwen.com/subject/yieefrtx.html