日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 1834. 单线程 CPU(排序 + 优先队列)

發(fā)布時(shí)間:2024/7/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 1834. 单线程 CPU(排序 + 优先队列) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1. 題目
    • 2. 解題

1. 題目

給你一個(gè)二維數(shù)組 tasks ,用于表示 n?????? 項(xiàng)從 0 到 n - 1 編號的任務(wù)。
其中 tasks[i] = [enqueueTimei, processingTimei] 意味著第 i?????????? 項(xiàng)任務(wù)將會(huì)于 enqueueTimei 時(shí)進(jìn)入任務(wù)隊(duì)列,需要 processingTimei 的時(shí)長完成執(zhí)行。

現(xiàn)有一個(gè)單線程 CPU ,同一時(shí)間只能執(zhí)行 最多一項(xiàng) 任務(wù),該 CPU 將會(huì)按照下述方式運(yùn)行:

  • 如果 CPU 空閑,且任務(wù)隊(duì)列中沒有需要執(zhí)行的任務(wù),則 CPU 保持空閑狀態(tài)。
  • 如果 CPU 空閑,但任務(wù)隊(duì)列中有需要執(zhí)行的任務(wù),則 CPU 將會(huì)選擇 執(zhí)行時(shí)間最短 的任務(wù)開始執(zhí)行。如果多個(gè)任務(wù)具有同樣的最短執(zhí)行時(shí)間,則選擇下標(biāo)最小的任務(wù)開始執(zhí)行。
  • 一旦某項(xiàng)任務(wù)開始執(zhí)行,CPU 在 執(zhí)行完整個(gè)任務(wù) 前都不會(huì)停止。
  • CPU 可以在完成一項(xiàng)任務(wù)后,立即開始執(zhí)行一項(xiàng)新任務(wù)。

返回 CPU 處理任務(wù)的順序。

示例 1: 輸入:tasks = [[1,2],[2,4],[3,2],[4,1]] 輸出:[0,2,3,1] 解釋:事件按下述流程運(yùn)行: - time = 1 ,任務(wù) 0 進(jìn)入任務(wù)隊(duì)列,可執(zhí)行任務(wù)項(xiàng) = {0} - 同樣在 time = 1 ,空閑狀態(tài)的 CPU 開始執(zhí)行任務(wù) 0 ,可執(zhí)行任務(wù)項(xiàng) = {} - time = 2 ,任務(wù) 1 進(jìn)入任務(wù)隊(duì)列,可執(zhí)行任務(wù)項(xiàng) = {1} - time = 3 ,任務(wù) 2 進(jìn)入任務(wù)隊(duì)列,可執(zhí)行任務(wù)項(xiàng) = {1, 2} - 同樣在 time = 3 ,CPU 完成任務(wù) 0 并開始執(zhí)行隊(duì)列中用時(shí)最短的任務(wù) 2 ,可執(zhí)行任務(wù)項(xiàng) = {1} - time = 4 ,任務(wù) 3 進(jìn)入任務(wù)隊(duì)列,可執(zhí)行任務(wù)項(xiàng) = {1, 3} - time = 5 ,CPU 完成任務(wù) 2 并開始執(zhí)行隊(duì)列中用時(shí)最短的任務(wù) 3 ,可執(zhí)行任務(wù)項(xiàng) = {1} - time = 6 ,CPU 完成任務(wù) 3 并開始執(zhí)行任務(wù) 1 ,可執(zhí)行任務(wù)項(xiàng) = {} - time = 10 ,CPU 完成任務(wù) 1 并進(jìn)入空閑狀態(tài)示例 2: 輸入:tasks = [[7,10],[7,12],[7,5],[7,4],[7,2]] 輸出:[4,3,2,0,1] 解釋:事件按下述流程運(yùn)行: - time = 7 ,所有任務(wù)同時(shí)進(jìn)入任務(wù)隊(duì)列,可執(zhí)行任務(wù)項(xiàng) = {0,1,2,3,4} - 同樣在 time = 7 ,空閑狀態(tài)的 CPU 開始執(zhí)行任務(wù) 4 ,可執(zhí)行任務(wù)項(xiàng) = {0,1,2,3} - time = 9 ,CPU 完成任務(wù) 4 并開始執(zhí)行任務(wù) 3 ,可執(zhí)行任務(wù)項(xiàng) = {0,1,2} - time = 13 ,CPU 完成任務(wù) 3 并開始執(zhí)行任務(wù) 2 ,可執(zhí)行任務(wù)項(xiàng) = {0,1} - time = 18 ,CPU 完成任務(wù) 2 并開始執(zhí)行任務(wù) 0 ,可執(zhí)行任務(wù)項(xiàng) = {1} - time = 28 ,CPU 完成任務(wù) 0 并開始執(zhí)行任務(wù) 1 ,可執(zhí)行任務(wù)項(xiàng) = {} - time = 40 ,CPU 完成任務(wù) 1 并進(jìn)入空閑狀態(tài)提示: tasks.length == n 1 <= n <= 10^5 1 <= enqueueTimei, processingTimei <= 10^9

https://leetcode-cn.com/contest/weekly-contest-237/problems/single-threaded-cpu/

2. 解題

  • 先按時(shí)間排序任務(wù),將任務(wù)加入優(yōu)先隊(duì)列
  • 優(yōu)先隊(duì)列出列的時(shí)候,更新當(dāng)前時(shí)間,然后將到時(shí)間了的,需要執(zhí)行的任務(wù)加入優(yōu)先隊(duì)列,重復(fù)此步驟
typedef pair<int,int> pii; struct cmp{bool operator()(pii& a, pii& b) const{ // 持續(xù)時(shí)間,下標(biāo) piarif(a.first == b.first) return a.second > b.second;//下標(biāo)小的優(yōu)先return a.first > b.first;//持續(xù)時(shí)間短的優(yōu)先} };class Solution { public:vector<int> getOrder(vector<vector<int>>& tasks) {int n = tasks.size(), k = 0;vector<int> ans(n);vector<int> idx(n);iota(idx.begin(), idx.end(), 0);sort(idx.begin(), idx.end(),[&](auto a, auto b){return tasks[a][0] < tasks[b][0];//按開始時(shí)間排序});priority_queue<pii,vector<pii>,cmp> q;// 存儲(chǔ) {持續(xù)時(shí)間,下標(biāo)}int t = 0;for(int i = 0; i < n; ){while(i < n && tasks[idx[i]][0] <= t){ // 等待執(zhí)行的任務(wù),加入隊(duì)列q.push({tasks[idx[i]][1], idx[i]});i++;}if(!q.empty()){ // 做任務(wù),優(yōu)先級最高的先int delta = q.top().first, id = q.top().second;int start = tasks[id][0]; // 任務(wù)開始時(shí)間q.pop();ans[k++] = id;t = max(t, start);//當(dāng)前時(shí)間t += delta;// t 為干完活的時(shí)間}else // 隊(duì)列為空,時(shí)間移到下一個(gè)任務(wù){t = tasks[idx[i]][0];}}while(!q.empty()){int id = q.top().second;q.pop();ans[k++] = id;}return ans;} };

576 ms 112.1 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

長按或掃碼關(guān)注我的公眾號(Michael阿明),一起加油、一起學(xué)習(xí)進(jìn)步!

總結(jié)

以上是生活随笔為你收集整理的LeetCode 1834. 单线程 CPU(排序 + 优先队列)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。