LeetcodeT621

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

難度中等231 收藏 分享 切換為英文 關(guān)注 反饋

給定一個(gè)用字符數(shù)組表示的 CPU 需要執(zhí)行的任務(wù)列表。其中包含使用大寫的 A - Z 字母表示的26 種不同種類的任務(wù)唱蒸。任務(wù)可以以任意順序執(zhí)行邦鲫,并且每個(gè)任務(wù)都可以在 1 個(gè)單位時(shí)間內(nèi)執(zhí)行完。CPU 在任何一個(gè)單位時(shí)間內(nèi)都可以執(zhí)行一個(gè)任務(wù)神汹,或者在待命狀態(tài)庆捺。

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

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

示例 :

<pre style="box-sizing: border-box; font-size: 13px; font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace; margin-top: 0px; margin-bottom: 1em; overflow: auto; background: rgb(247, 249, 250); padding: 10px 15px; color: rgb(38, 50, 56); line-height: 1.6; border-radius: 3px; white-space: pre-wrap;">輸入:tasks = ["A","A","A","B","B","B"], n = 2
輸出:8
解釋:A -> B -> (待命) -> A -> B -> (待命) -> A -> B.

提示:

  1. 任務(wù)的總個(gè)數(shù)為 [1, 10000]醉者。
  2. n 的取值范圍為 [0, 100]但狭。

拿到題之后可以看出這是一道最優(yōu)解的問題,簡(jiǎn)單點(diǎn)的話用貪心就能解決不行的話用動(dòng)態(tài)規(guī)劃解撬即。首先貪心的思想思考下立磁,用數(shù)字最多的字母優(yōu)先按間隔排開,第二多的次之剥槐。根據(jù)測(cè)試用例似乎沒什么毛病唱歧,嘗試一下。

public int leastInterval(char[] tasks, int n) {
    //若10000個(gè)數(shù)都為同一個(gè)字母粒竖,間隔為100颅崩,需要開10000 * 100 這么大的數(shù)組 稍微多給點(diǎn)
    // (可以算一下內(nèi)存,但不影響實(shí)現(xiàn)初步思路

    char[] array = new char[tasks.length * (n + 1)];

    Map<Character, Integer> map = new HashMap<>();

    // 統(tǒng)計(jì)每個(gè)字符的個(gè)數(shù)
    for (char c : tasks) {
        Integer k = 0;
        if ((k = map.get(c)) != null) {
            map.put(c, ++k);
        } else {
            map.put(c, 1);
        }
    }

    // Map轉(zhuǎn)成List用來按數(shù)量排序
    List<Map.Entry<Character, Integer>> list = new ArrayList<>();
    Iterator iterator = map.entrySet().iterator();
    while (iterator.hasNext()) {
        list.add((Map.Entry<Character, Integer>) iterator.next());
    }

    Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
        @Override
        public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
            return o2.getValue() - o1.getValue();
        }
    });

    // 接著開始給數(shù)組賦值

    int ans = 0;
    for (int i = 0; i < list.size(); i++) {
        int k = i;
        for (int j = 0; j < list.get(i).getValue(); j++) {
            if (array[k] == 0) {
                ans = Math.max(ans, k);
                array[k] = list.get(i).getKey();
                k += n + 1;
            } else {
                // 找到一個(gè)空的位置
                while (array[++k] != 0);
                ans = Math.max(ans, k);
                array[k] = list.get(i).getKey();
            }
        }
    }

    // 因?yàn)閺?開始計(jì)的 所以結(jié)果+1
    return ans + 1;
}

根據(jù)這個(gè)代碼的空間復(fù)雜度 100 * 10000 和 時(shí)間復(fù)雜度約 (1+ n)* n / 2 來算蕊苗,這題根本過不了沿后。提交代碼準(zhǔn)備截個(gè)圖繼續(xù)寫優(yōu)化,結(jié)果朽砰。尖滚。。

image.png

換一個(gè)思路繼續(xù)講瞧柔。漆弄。。
剛才是先按照最多的字母來插空造锅,現(xiàn)在換一種隔韭菜的方式撼唾,截取最高的,也就是數(shù)量最多的先進(jìn)入隊(duì)列哥蔚,計(jì)算量在于每次隔完一輪都需要對(duì)字母進(jìn)行重新排序倒谷。

public int leastInterval(char[] tasks, int n) {

    // 統(tǒng)計(jì)字符以及數(shù)量同上。肺素。恨锚。

    // i 代表第幾個(gè)入隊(duì)列,也就是最后的結(jié)果
    int i = 0;
    while (true) {
        Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() {
            @Override
            public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
                return o2.getValue() - o1.getValue();
            }
        });

        // 因?yàn)橐獎(jiǎng)h掉用光了的字母,就用迭代器的方式
        Iterator iterator1 = list.iterator();
        for (int j = 0; j <= n; i++, j++) {

            if (iterator1.hasNext()) {
                Map.Entry<Character, Integer> entry = (Map.Entry<Character, Integer>) iterator1.next();
                array[i] = entry.getKey();
                int t = entry.getValue() - 1;
                if (t == 0) {
                    iterator1.remove();
                } else {
                    entry.setValue(t);
                }
            }
            if (list.size() == 0) {
                break;
            }
        }

        if (list.size() == 0) {
            break;
        }
    }
    // 因?yàn)閺?開始計(jì)的 所以結(jié)果+1
    return i + 1;

}

結(jié)果是比上面的更費(fèi)時(shí)倍靡,但內(nèi)存方面在上面基礎(chǔ)上還可以優(yōu)化,方法二中的array只是為了調(diào)試打印用的课舍,完全可以刪除塌西。

本文大概梳理了下自己的思考過程他挎,供大家參考與交流。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末捡需,一起剝皮案震驚了整個(gè)濱河市办桨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌站辉,老刑警劉巖呢撞,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異饰剥,居然都是意外死亡殊霞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門汰蓉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绷蹲,“玉大人,你說我怎么就攤上這事顾孽∽8郑” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵若厚,是天一觀的道長(zhǎng)拦英。 經(jīng)常有香客問我,道長(zhǎng)测秸,這世上最難降的妖魔是什么龄章? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮乞封,結(jié)果婚禮上做裙,老公的妹妹穿的比我還像新娘。我一直安慰自己肃晚,他們只是感情好锚贱,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著关串,像睡著了一般拧廊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晋修,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天吧碾,我揣著相機(jī)與錄音,去河邊找鬼墓卦。 笑死倦春,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睁本,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼尿庐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了呢堰?” 一聲冷哼從身側(cè)響起抄瑟,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎枉疼,沒想到半個(gè)月后皮假,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡骂维,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年惹资,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片席舍。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡布轿,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出来颤,到底是詐尸還是另有隱情汰扭,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布福铅,位于F島的核電站萝毛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏滑黔。R本人自食惡果不足惜笆包,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望略荡。 院中可真熱鬧庵佣,春花似錦、人聲如沸汛兜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粥谬。三九已至肛根,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間漏策,已是汗流浹背派哲。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留掺喻,地道東北人芭届。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓储矩,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親喉脖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子椰苟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 3,333評(píng)論 0 2
  • 選擇題部分 1.(),只有在發(fā)生短路事故時(shí)或者在負(fù)荷電流較大時(shí),變流器中才會(huì)有足夠的二次電流作為繼電保護(hù)跳閘之用抑月。...
    skystarwuwei閱讀 12,817評(píng)論 0 7
  • 1. file n. 文件树叽;v. 保存文件2. command n. 命令指令3. use v. 使用用途4. p...
    喵嗚Yuri閱讀 749評(píng)論 0 4
  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,369評(píng)論 0 5
  • 假期里讀了錢鍾書先生的《圍城》题诵,這兩天又讀了楊絳先生的《我們仨》。對(duì)于楊絳先生和錢鍾書先生层皱,我了解的并不多性锭,沒有讀...
    木葉蕭蕭等風(fēng)來閱讀 2,622評(píng)論 2 8