力扣貪心 630. 課程表 III

這裏有 n 門不同的在線課程,他們按從 1 到 n 編號。每一門課程有一定的持續上課時間(課程時間)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.整數 1 <= d, t, n <= 10,000 。
2.你不能同時修兩門課程。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/course-schedule-iii

典型的貪心,按結束時間排序,然後按順序插入隊列,並且維護隊列內用時最小(即維護優先隊列的用時大的再上面有利維護)

需要講一下Arrays.sort對二維數組的默認排序(以行爲排序單位)

對於一個已定義的二位數組a進行如下規則排序,首先按照每一個對應的一維數組第一個元素進行升序排序(即a[][0]),若第一個元素相等,則按照第二個元素進行升序排序(a[][1])。(特別注意,這裏的a[][0]或者a[][1]在java中是不能這麼定義的,這裏只是想說明是對於某一個一維數組的第0或1個元素進行排序)

public class Solution {
    public int scheduleCourse(int[][] courses) {
        Arrays.sort(courses, (a, b) -> a[1] - b[1]);
        PriorityQueue < Integer > queue = new PriorityQueue < > ((a, b) -> b - a);
        int time = 0;
        for (int[] c: courses) {
            if (time + c[0] <= c[1]) {
                queue.offer(c[0]);
                time += c[0];
            } else if (!queue.isEmpty() && queue.peek() > c[0]) {
                time += c[0] - queue.poll();
                queue.offer(c[0]);
            }
        }
        return queue.size();
    }
}

相似題目
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章