Leetcode630. 課程表 III

Every day a Leetcode

題目來源:630. 課程表 III

解法1:反悔貪心

經驗告訴我們,在準備期末考試的時候,先考的課程先準備。同理,lastDay 越早的課程,應當越早上完。但是,有的課程 duration 比較長,上完需要花很多時間,可能把這些時間花在其它課程,早就上完好幾門課了。

看上去,找不到一個合適的貪心策略。別放棄!順著這個思路,如果我們可以「反悔」呢?

按照 lastDay 從小到大排序,然后遍歷數組 courses。比如先上完 duration=7 的課和 duration=10 的課,后面遍歷到了 duration=4 的課,但受到 lastDay 的限制,無法上 duration=4 的課。此時,我們可以「撤銷」前面 duration 最長的課,也就是 duration=10 的課,這樣就可以上 duration=4 的課了!雖然能上完的課程數目沒有變化,但是由于我們多出了 10?4=6 天時間,在后續的遍歷中,更有機會上完更多的課程。

在上面的討論中,我們需要維護一個數據結構,來幫助我們快速找到 duration 最長的課程。這可以用優先隊列(大根堆)解決。

代碼:

/** @lc app=leetcode.cn id=630 lang=cpp** [630] 課程表 III*/// @lc code=start
class Solution
{
public:int scheduleCourse(vector<vector<int>> &courses){// 大根堆priority_queue<int> pq;int day = 0; // 已消耗時間sort(courses.begin(), courses.end(), [](const auto &a, const auto &b){return a[1] < b[1]; // 按照 lastDay 從小到大排序});for (vector<int> &course : courses){int duration = course[0], lastDay = course[1];if (day + duration <= lastDay){// 沒有超過 lastDay,直接學習day += duration;pq.push(duration);}// 該課程的時間比之前的最長時間要短else if (!pq.empty() && duration < pq.top()){// 反悔,撤銷之前 duration 最長的課程,改為學習該課程// 節省出來的時間,能在后面上完更多的課程day -= pq.top();pq.pop();day += duration;pq.push(duration);}}return pq.size();}
};
// @lc code=end

結果:

在這里插入圖片描述

復雜度分析:

時間復雜度:O(nlogn),其中 n 為數組 courses 的長度。排序需要 O(nlog?n) 的時間;遍歷 courses\textit{courses}courses 時,每次操作堆都需要 O(log?n) 的時間。總的時間復雜度為 O(nlog?n)。

空間復雜度:O(n),其中 n 為數組 courses 的長度。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/715959.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/715959.shtml
英文地址,請注明出處:http://en.pswp.cn/news/715959.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2023年09月CCF-GESP編程能力等級認證Scratch圖形化編程四級真題解析

一、單選題(共15題,共30分) 第1題 人們所使用的手機上安裝的 App 通常指的是( )。 A:一款操作系統 B:一款應用軟件 C:一種通話設備 D:以上都不對 答案:B 第2題 下列流程圖的輸出結果是?( ) A:9 B:7 C:5 D:11 答案:A 第3題 默認小貓角色,執行下列程序…

IO,硬盤與文件

IO與計算機存儲空間 IO&#xff08;輸入/輸出&#xff09;是計算機領域中指的是數據在計算機與外部設備之間的傳輸過程。存儲通常指的是計算機中用來保存數據的介質或設備&#xff0c;硬盤是存儲設備的一種&#xff0c;通常是指硬盤驅動器&#xff08;Hard Disk Drive&#xf…

文章解讀與仿真程序復現思路——電網技術EI\CSCD\北大核心《考慮時空相關性的流域水風光多能互補系統高維不確定性場景生成方法》

本專欄欄目提供文章與程序復現思路&#xff0c;具體已有的論文與論文源程序可翻閱本博主免費的專欄欄目《論文與完整程序》 論文與完整源程序_電網論文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 這篇文章的標題涵蓋了以下幾個關鍵方…

C語言編程大題

以下總結編程大題的常考題型 1,輸出 100-200 之間所有素數。 要求: (1)編寫一個判斷一個整數是否為素數的函數 void prime(int n),若是素數則輸出,否則不輸出 (2)主函數中調用 prime 函數,輸出 100-200 之間所有素數 說明:素數是指除了1和該數本身之外,不能被其它任何整…

【C++】用命名空間避免命名沖突

&#x1f338;博主主頁&#xff1a;釉色清風&#x1f338;文章專欄&#xff1a;C&#x1f338;今日語錄&#xff1a;如果神明還不幫你&#xff0c;說明他相信你。 &#x1fab7;文章簡介&#xff1a;這篇文章是結合譚浩強老師的書以及自己的理解&#xff0c;同時加入了一些例子…

NOC2023軟件創意編程(學而思賽道)python小高組初賽真題

軟件創意編程 一、參賽范圍 1.參賽組別:小學低年級組(1-3 年級)、小學高年級組(4-6 年級)、初中組。 2.參賽人數:1 人。 3.指導教師:1 人(可空缺)。 4.每人限參加 1 個賽項。 組別確定:以地方教育行政主管部門(教委、教育廳、教育局) 認定的選手所屬學段為準。 二、…

MATLAB知識點:if條件判斷語句的嵌套

?講解視頻&#xff1a;可以在bilibili搜索《MATLAB教程新手入門篇——數學建模清風主講》。? MATLAB教程新手入門篇&#xff08;數學建模清風主講&#xff0c;適合零基礎同學觀看&#xff09;_嗶哩嗶哩_bilibili 節選自?第4章&#xff1a;MATLAB程序流程控制 我們通過一個…

基于springboot+vue的教師工作量管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Java集合-Map接口

在Java中&#xff0c;Map接口表示鍵值對的集合&#xff0c;其中每個鍵都是唯一的&#xff0c;并且每個鍵映射到一個值。Map接口是集合框架中的一部分&#xff0c;位于java.util包中。它定義了一系列操作來管理鍵值對&#xff0c;例如添加鍵值對、刪除鍵值對、獲取鍵對應的值等。…

7.1.1 selenium介紹及安裝chromedriver

目錄 1. Selenium的用途 2. 安裝Selenium庫 3. 安裝chromedriver 1. 查看谷歌版本號?編輯 2. 找到最新版本及下載 3. 配置環境變量 4. 檢測是否配置成功 5. 用python初始化瀏覽器對象檢測&#xff1a; 6. 參考鏈接 1. Selenium的用途 在前面我們提到&#xff1a;在我…

Github項目推薦-LightMirrors

項目地址 https://github.com/NoCLin/LightMirrors 項目簡述 “LightMirrors是一個開源的緩存鏡像站服務&#xff0c;用于加速軟件包下載和鏡像拉取。目前支持DockerHub、PyPI、PyTorch、NPM等鏡像緩存服務。 當前項目仍處于早期階段。”–來自項目說明。 也就是說&#xff…

爆紅提醒:ESLint: Parsing error: Unexpected token. Did you mean `{‘>‘}` or `gt;`?

錯誤情況&#xff1a;> 會爆紅提示&#xff1a;ESLint: Parsing error: Unexpected token. Did you mean {>} or >? function().then((res) > {console.log(res.data); }解決方法&#xff1a;修改.eslintrc或者.eslintrc.js的配置 module.exports {// 其他配置..…

RocketMq——Consume相關源碼

摘要 RocketMQ只要有CommitLog文件就可以正常運行了&#xff0c;那為何還要維護ConsumeQueue文件呢&#xff1f; ConsumeQueue是消費隊列&#xff0c;引入它的目的是為了提高消費者的消費速度。畢竟RocketMQ是基于Topic主題訂閱模式的&#xff0c;消費者往往只關心自己訂閱的…

定制開發一款家政小程序,應知應會

引言 在這個快節奏的現代生活中&#xff0c;人們對高效、便捷的家政服務的需求日益增加。隨著社會結構的變化和職業生活的繁忙&#xff0c;許多家庭面臨著時間不足、精力不濟的挑戰。在這種情況下&#xff0c;家政服務成為解決問題的有效途徑。然而&#xff0c;傳統的家政服務…

Python——桌面攝像頭軟件(附源碼+打包)

目錄 一、前言 二、桌面攝像頭軟件 2.1、下載項目 2.2、功能介紹 三、打包工具&#xff08;nuitka&#xff09; 四、項目文件復制&#xff08;我全部合到一個文件里面了&#xff09; 五、結語 一、前言 看見b站的向軍大叔用electron制作了一個桌面攝像頭軟件 但是&#x…

PPT 批量刪除每頁相同位置的內容

方法&#xff1a; 選擇【視圖】&#xff0c;【宏】&#xff0c;設置宏的名稱&#xff0c;點創建將下列函數復制到宏中&#xff0c;在ppt中先選擇某個要刪除的對象&#xff0c;然后運行宏即可 函數內容如下 Sub Delete( ) Dim oSlide As Slide, oShape As Shape Dim myWidt…

如何在jupyter notebook 中下載第三方庫

在anconda 中找到&#xff1a; Anaconda Prompt 進入頁面后的樣式&#xff1a; 在黑色框中輸入&#xff1a; 下載第三方庫的命令 第三方庫&#xff1a; 三種輸入方式 標準保證正確 pip instsall 包名 -i 鏡像源地址 pip install pip 是 Python 包管理工具&#xff0c;…

新項目,Linux上一鍵安裝MySQL,Redis,Nacos,Minio

大家好&#xff0c;我是 jonssonyan 分享一個我的一個開源項目&#xff0c;這是一個在 Linux 平臺上一鍵安裝各種軟件的腳本項目&#xff0c;腳本使用 Shell 語言編寫&#xff0c;后續還會增加更多軟件的一鍵安裝&#xff0c;代碼在 GitHub 上全部開源的&#xff0c;開源地址如…

【Python】進階學習:pandas--如何根據指定條件篩選數據

【Python】進階學習&#xff1a;pandas–如何根據指定條件篩選數據 &#x1f308; 個人主頁&#xff1a;高斯小哥 &#x1f525; 高質量專欄&#xff1a;Matplotlib之旅&#xff1a;零基礎精通數據可視化、Python基礎【高質量合集】、PyTorch零基礎入門教程&#x1f448; 希望…

2024第二次培訓:win11系統下使用nginx、JDK、mysql搭建基于vue2、java前后端分離的web應用運行環境

一.背景 公司安排了帶徒弟的任務&#xff0c;給培訓寫點材料。前面分開介紹了mysql、jdk、nginx的安裝&#xff0c;都只是零星的介紹&#xff0c;只能算零散的學習。學習了有什么用呢&#xff1f;能解決什么問題&#xff1f;能完成什么工作&#xff1f; 今天我們要用之前的幾篇…