国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列: Leetcode 621. 任務(wù)調(diào)度器 (Typescript版)

這篇具有很好參考價(jià)值的文章主要介紹了數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列: Leetcode 621. 任務(wù)調(diào)度器 (Typescript版)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

任務(wù)調(diào)度器

  • https://leetcode.cn/problems/task-scheduler/

描述

  • 給你一個(gè)用字符數(shù)組 tasks 表示的 CPU 需要執(zhí)行的任務(wù)列表。其中每個(gè)字母表示一種不同種類的任務(wù)。任務(wù)可以以任意順序執(zhí)行,并且每個(gè)任務(wù)都可以在 1 個(gè)單位時(shí)間內(nèi)執(zhí)行完。在任何一個(gè)單位時(shí)間,CPU 可以完成一個(gè)任務(wù),或者處于待命狀態(tài)。

  • 然而,兩個(gè) 相同種類 的任務(wù)之間必須有長(zhǎng)度為整數(shù) n 的冷卻時(shí)間,因此至少有連續(xù) n 個(gè)單位時(shí)間內(nèi) CPU 在執(zhí)行不同的任務(wù),或者在待命狀態(tài)。

  • 你需要計(jì)算完成所有任務(wù)所需要的最短時(shí)間。

示例 1:

輸入:tasks = ["A","A","A","B","B","B"], n = 2
輸出:8
解釋:A -> B -> (待命) -> A -> B -> (待命) -> A -> B
     在本示例中,兩個(gè)相同類型任務(wù)之間必須間隔長(zhǎng)度為 n = 2 的冷卻時(shí)間,而執(zhí)行一個(gè)任務(wù)只需要一個(gè)單位時(shí)間,所以中間出現(xiàn)了(待命)狀態(tài)。 

示例 2:

輸入:tasks = ["A","A","A","B","B","B"], n = 0
輸出:6
解釋:在這種情況下,任何大小為 6 的排列都可以滿足要求,因?yàn)?n = 0
["A","A","A","B","B","B"]
["A","B","A","B","A","B"]
["B","B","B","A","A","A"]
...
諸如此類

示例 3:

輸入:tasks = ["A","A","A","A","A","A","B","C","D","E","F","G"], n = 2
輸出:16
解釋:一種可能的解決方案是:
     A -> B -> C -> A -> D -> E -> A -> F -> G -> A -> (待命) -> (待命) -> A -> (待命) -> (待命) -> A

提示:

  • 1 <= task.length <= 1 0 4 10^4 104
  • tasks[i] 是大寫(xiě)英文字母
  • n 的取值范圍為 [0, 100]

算法實(shí)現(xiàn)

1 )方案 1

function leastInterval(tasks: string[], n: number): number {
    let result = '' // 最終隊(duì)列執(zhí)行的結(jié)果
    const dict = {} // 對(duì)歸類進(jìn)行存儲(chǔ)
    tasks.forEach((item) => {
        dict[item] ? (dict[item] ++) : (dict[item] = 1)
    })
    while(true) {
        // 任務(wù)清單
        const keys = Object.keys(dict)
        // 任務(wù)處理完畢跳出
        if (!keys.length) {
            break
        }
        // 正常處理過(guò)程
        let tmp = [] // 用于存儲(chǔ) 1 + n個(gè)任務(wù)單元
        for (let i = 0; i <= n; i++) {
            let max:number = 0 // 找到最大的任務(wù)
            let key:string
            let pos:number
            // 遍歷任務(wù)清單
            keys.forEach((item, idx) => {
                // 當(dāng)前任務(wù)數(shù)量大于max
                if (dict[item] > max) {
                    max = dict[item] // 存儲(chǔ)更新max
                    key = item // 存儲(chǔ)更新當(dāng)前任務(wù)
                    pos = idx // 存儲(chǔ)更新當(dāng)前任務(wù)下標(biāo)索引,用于后續(xù)的刪除操作
                }
            })
            // 沒(méi)有匹配到key, 直接跳出此次循環(huán)
            if (!key) {
                break
            }
            // 找到了key
            tmp.push(key) // 臨時(shí)隊(duì)列添加當(dāng)前的key
            keys.splice(pos, 1) // 將當(dāng)前key從任務(wù)隊(duì)列中刪除
            dict[key] -- // 更新key的長(zhǎng)度,已消費(fèi)完成,刪除來(lái)更新剩余個(gè)數(shù)
            // 當(dāng)全部消費(fèi)完成,移除當(dāng)前的任務(wù)
            if (dict[key] < 1) {
                delete dict[key]
            }
        }
        result += tmp.join('').padEnd(n + 1, '-') // 如果不全,補(bǔ)充冷卻時(shí)間
    }
    // 邊界的處理, 最后不要出現(xiàn)冷卻時(shí)間
    result = result.replace(/-+$/, '')
    return result.length
}
  • 關(guān)鍵需求分析:
    • 兩個(gè) 相同種類 的任務(wù)之間必須有長(zhǎng)度為整數(shù) n 的冷卻時(shí)間
    • 因此至少有連續(xù) n 個(gè)單位時(shí)間內(nèi) CPU 在執(zhí)行不同的任務(wù),或者在待命狀態(tài)。
    • 要求,完成所有任務(wù)的最短時(shí)間
  • 從上面的描述和示例中可見(jiàn)
    • 隊(duì)列中有A,B,C,…, 現(xiàn)在開(kāi)啟了一個(gè)任務(wù)
    • 如果當(dāng)前開(kāi)啟了A任務(wù),那接下來(lái)n個(gè)的任務(wù)中不能有A了
    • 如果其他任務(wù)不夠n的長(zhǎng)度,那么要冷卻等待
    • 只要現(xiàn)在隊(duì)列中還有任務(wù),我就要處理任務(wù)本身和n個(gè)任務(wù)冷卻時(shí)間的 n+1 的任務(wù),
    • 也就是從隊(duì)列中取出這些任務(wù)來(lái)存放,求最短的存放時(shí)間
      • 如何做到最短,考慮使用最多的任務(wù)優(yōu)先處理,盡量不會(huì)有剩余,交叉著來(lái)
      • 少的來(lái)進(jìn)行插縫作業(yè),這樣即保證少的任務(wù)使用了
      • 又保證多的任務(wù)不會(huì)用冷卻時(shí)間處理來(lái)占用更多資源
  • 這個(gè)算法,在實(shí)現(xiàn)上效率不高

2 )方案 2文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-433660.html

function leastInterval(tasks: string[], n: number): number {
  // 初始化一個(gè)矩陣,用于存儲(chǔ)給定任務(wù)的數(shù)量的字典
  const cnts = Array(26).fill(0);
  for(const c of tasks) {
    cnts[c.charCodeAt(0) - 'A'.charCodeAt(0)]++;
  }
  // 統(tǒng)計(jì)出任務(wù)中對(duì)多的數(shù)量
  let max = 0, tot = 0;
  for (let i = 0; i < 26; i++) {
    max = Math.max(max, cnts[i]);
  }
  // 更新tot變量的值,用于統(tǒng)計(jì)具有最多執(zhí)行次數(shù)的任務(wù)數(shù)量
  for (let i = 0; i < 26; i++) {
    tot += max === cnts[i] ? 1 : 0;
  }
  // 這里是最核心的算法
  return Math.max(tasks.length, (n + 1) * (max - 1) + tot)
};
  • 這是官方示例,效率很高
  • 這里用到charCodeAt() 方法可返回指定位置的字符的 Unicode 編碼
  • 后續(xù)有時(shí)間再研究下:https://leetcode.cn/problems/task-scheduler/solution/ren-wu-diao-du-qi-by-leetcode-solution-ur9w/ 中的方法二:構(gòu)造

到了這里,關(guān)于數(shù)據(jù)結(jié)構(gòu)與算法之隊(duì)列: Leetcode 621. 任務(wù)調(diào)度器 (Typescript版)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(11)[用隊(duì)列實(shí)現(xiàn)棧]

    【LeetCode】數(shù)據(jù)結(jié)構(gòu)題解(11)[用隊(duì)列實(shí)現(xiàn)棧]

    所屬專欄:玩轉(zhuǎn)數(shù)據(jù)結(jié)構(gòu)題型?? ?? 博主首頁(yè):初陽(yáng)785?? ?? 代碼托管:chuyang785?? ?? 感謝大家的支持,您的點(diǎn)贊和關(guān)注是對(duì)我最大的支持?。?!?? ?? 博主也會(huì)更加的努力,創(chuàng)作出更優(yōu)質(zhì)的博文!!?? ?? 關(guān)注我,關(guān)注我,關(guān)注我,重要的事情說(shuō)三遍?。。。?!

    2024年02月13日
    瀏覽(24)
  • 【LeetCode】621.任務(wù)調(diào)度器

    給你一個(gè)用字符數(shù)組? tasks ?表示的 CPU 需要執(zhí)行的任務(wù)列表。其中每個(gè)字母表示一種不同種類的任務(wù)。任務(wù)可以以任意順序執(zhí)行,并且每個(gè)任務(wù)都可以在 1 個(gè)單位時(shí)間內(nèi)執(zhí)行完。在任何一個(gè)單位時(shí)間,CPU 可以完成一個(gè)任務(wù),或者處于待命狀態(tài)。 然而,兩個(gè) ?相同種類 ?的任

    2024年02月09日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)】如何用隊(duì)列實(shí)現(xiàn)棧?圖文詳解(LeetCode)

    【數(shù)據(jù)結(jié)構(gòu)】如何用隊(duì)列實(shí)現(xiàn)棧?圖文詳解(LeetCode)

    LeetCode鏈接:225. 用隊(duì)列實(shí)現(xiàn)棧 - 力扣(LeetCode) 本文默認(rèn)讀者已經(jīng)掌握棧與隊(duì)列的基本知識(shí) 或者先看我的另一篇博客:【數(shù)據(jù)結(jié)構(gòu)】棧與隊(duì)列_字節(jié)連結(jié)的博客-CSDN博客 由于我們使用的是C語(yǔ)言,不能直接使用隊(duì)列的操作, 所以做這道題得先把我們之前實(shí)現(xiàn)的隊(duì)列復(fù)制過(guò)來(lái):

    2024年02月12日
    瀏覽(20)
  • 【數(shù)據(jù)結(jié)構(gòu)】如何用棧實(shí)現(xiàn)隊(duì)列?圖文解析(LeetCode)

    【數(shù)據(jù)結(jié)構(gòu)】如何用棧實(shí)現(xiàn)隊(duì)列?圖文解析(LeetCode)

    LeetCode鏈接:232. 用棧實(shí)現(xiàn)隊(duì)列 - 力扣(LeetCode) 注:本文默認(rèn)讀者已掌握棧與隊(duì)列的基本操作 可以看這篇文章熟悉知識(shí)點(diǎn):【數(shù)據(jù)結(jié)構(gòu)】棧與隊(duì)列_字節(jié)連結(jié)的博客-CSDN博客 目錄 做題思路 代碼實(shí)現(xiàn) 1. MyQueue 2. myQueueCreate 3. myQueuePush 4. myQueuePeek 5. myQueuePop 6. myQueueEmpty 7. myQueueF

    2024年02月11日
    瀏覽(16)
  • 【LeetCode】【數(shù)據(jù)結(jié)構(gòu)】棧與隊(duì)列必刷OJ題

    【LeetCode】【數(shù)據(jù)結(jié)構(gòu)】棧與隊(duì)列必刷OJ題

    ?? 樊梓慕: 個(gè)人主頁(yè) ? ?? 個(gè)人專欄: 《C語(yǔ)言》《數(shù)據(jù)結(jié)構(gòu)》《藍(lán)橋杯試題》《LeetCode刷題筆記》 ?? 每一個(gè)不曾起舞的日子,都是對(duì)生命的辜負(fù) 目錄 前言: 【LeetCode】20.有效的括號(hào)(棧的括號(hào)匹配問(wèn)題) 【LeetCode】225.用隊(duì)列實(shí)現(xiàn)棧 【LeetCode】232.用棧實(shí)現(xiàn)隊(duì)列 【LeetCo

    2024年02月13日
    瀏覽(23)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法】--隊(duì)列的特殊結(jié)構(gòu)-循環(huán)隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)和算法】--隊(duì)列的特殊結(jié)構(gòu)-循環(huán)隊(duì)列

    循環(huán)隊(duì)列是隊(duì)列的一種特殊結(jié)構(gòu),它的 長(zhǎng)度是固定的 k ,同樣是 先進(jìn)先出 ,理論結(jié)構(gòu)是 首尾相連的環(huán)形循環(huán)結(jié)構(gòu) 。其理論結(jié)構(gòu)大致如下: 具體結(jié)構(gòu)描述可以參考 LeetCode : 622. 設(shè)計(jì)循環(huán)隊(duì)列的題目要求,大致如下: 設(shè)計(jì)你的循環(huán)隊(duì)列實(shí)現(xiàn)。 循環(huán)隊(duì)列是一種 線性數(shù)據(jù)結(jié)構(gòu) ,

    2024年02月04日
    瀏覽(16)
  • 隊(duì)列——“數(shù)據(jù)結(jié)構(gòu)與算法”

    隊(duì)列——“數(shù)據(jù)結(jié)構(gòu)與算法”

    各位CSDN的uu們你們好呀,又好久不見(jiàn)啦,最近有點(diǎn)擺爛,甚是慚愧?。。?!今天,小雅蘭的內(nèi)容是隊(duì)列,下面,讓我們進(jìn)入隊(duì)列的世界吧?。?! 隊(duì)列 隊(duì)列的概念及結(jié)構(gòu) 隊(duì)列:只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有先進(jìn)先出FIF

    2024年02月06日
    瀏覽(23)
  • 算法與數(shù)據(jù)結(jié)構(gòu)-隊(duì)列

    算法與數(shù)據(jù)結(jié)構(gòu)-隊(duì)列

    ??隊(duì)列跟棧一樣,也是一種操作受限的線性表數(shù)據(jù)結(jié)構(gòu)。不過(guò),隊(duì)列是先進(jìn)者先出。 ??棧只支持兩個(gè)基本操作:入棧 push()和出棧 pop()。隊(duì)列跟棧非常相似,支持的操作也很有限,最基本的操作也是兩個(gè):入隊(duì) enqueue(),放一個(gè)數(shù)據(jù)到隊(duì)列尾部;出隊(duì) dequeue(),從隊(duì)列頭部取

    2024年02月12日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)與算法:隊(duì)列

    數(shù)據(jù)結(jié)構(gòu)與算法:隊(duì)列

    在上篇文章講解了棧之后,本篇也對(duì)這一章進(jìn)行收尾,來(lái)到隊(duì)列! 隊(duì)列(Queue)就像是排隊(duì)買(mǎi)票的人群。想象一下你去電影院看電影,人們?cè)谑燮贝翱谛纬梢粭l線(隊(duì)列)等待購(gòu)票。隊(duì)列遵循一個(gè)很重要的原則:先來(lái)先服務(wù)(First In, First Out,簡(jiǎn)稱FIFO)。這意味著最先到達(dá)并

    2024年02月22日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法】--隊(duì)列

    【數(shù)據(jù)結(jié)構(gòu)和算法】--隊(duì)列

    隊(duì)列是只允許在一端進(jìn)行插入數(shù)據(jù)操作,在另一端進(jìn)行刪除數(shù)據(jù)操作的特殊線性表,隊(duì)列具有 先進(jìn)先出 FIFO(First In First Out) 的原則。 入隊(duì)列 :進(jìn)行 插入操作的一端稱為隊(duì)尾 。 出隊(duì)列 :進(jìn)行 刪除操作的一端稱為隊(duì)頭 。 隊(duì)列結(jié)構(gòu)聯(lián)想起來(lái)也非常簡(jiǎn)單,如其名,隊(duì)列就相當(dāng)于

    2024年02月05日
    瀏覽(26)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包