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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

【LeetCode笔记】621. 任务调度器(Java、桶)

發布時間:2024/7/23 java 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【LeetCode笔记】621. 任务调度器(Java、桶) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 題目描述
  • 代碼 && 思路
      • 1. 直白的 ac 做法 O(n)、O(n)
      • 2. 桶排思想的做法 O(n)、O(n)
      • 二刷

打卡第十六天~

題目描述

  • 有點閱讀題的意思,可以結合例子理解一下題干~

代碼 && 思路

1. 直白的 ac 做法 O(n)、O(n)

  • 同樣是 O(n) 復雜度,比方法2慢了不少= =,不過勝在容易想~
  • wait[i]:記錄 i 的等待冷卻時間
  • counts[i]:記錄 i 的剩余任務數量
  • 設計思路很簡單,每次都選取當前不在冷卻的、數量最多的任務,沒有就待命即可
class Solution {public int leastInterval(char[] tasks, int n) {// 按照順序來,max 的先來int taskNums = tasks.length;int[] counts = new int[26];for(char c : tasks) {counts[c - 'A']++;}int[] wait = new int[26];int time = 0;while(taskNums != 0) {int index = chooseTask(counts, wait);// 不待命的情況if(index != -1) {// System.out.println("選擇" + (char)('A' + index));counts[index]--;taskNums--;}else {// System.out.println("待命");}updateWait(wait, index, n);time++;}return time;}public void updateWait(int[] wait, int index, int n) {for(int i = 0; i < 26; i++) {if(wait[i] < 0) {wait[i]++;}}if(index != -1) {wait[index] = -n;}}public int chooseTask(int[] counts, int[] wait) {int index = -1;int max = Integer.MIN_VALUE;for(int i = 0; i < 26; i++) {// 未冷卻,且存在的最大值if(wait[i] == 0 && counts[i] > max && counts[i] > 0) {max = counts[i];index = i;}}return index;} }

2. 桶排思想的做法 O(n)、O(n)

  • 參考了這篇題解的做法
  • 步驟一:counts[ ] 記錄各個任務的數量,維護最多任務數 maxTimes
  • 步驟二:找到擁有 maxTiems 的任務種類數 maxTaskCounts
  • 步驟三:根據公式計算結果:(maxTimes - 1) * (n + 1) + maxTaskCounts,如果公式結果小于 tasks.length,則選 tasks.length,否則選公式結果。
  • 原理相關:直接看上面鏈接的題解吧,結合圖片方便理解,我這里就不誤人子弟了= =
  • 關鍵點:
  • 步驟三對應兩種情況:有待命、無待命。
  • 最后一趟無需再等待 n
class Solution {public int leastInterval(char[] tasks, int n) {// 桶排思想// 1. 先找到 maxTimesint maxTimes = 0;int[] counts = new int[26];for(char c : tasks) {counts[c - 'A']++;maxTimes = Math.max(maxTimes, counts[c - 'A']);}// 2. 找到并列 maxTimes 的字符數 maxTaskCountsint maxTaskCounts = 0;for(int num : counts) {if(num == maxTimes) {maxTaskCounts++;}}// 3. 返回 task.length || (maxTimes - 1) * (n + 1) + maxTaskCountsreturn Math.max(tasks.length, (maxTimes - 1) * (n + 1) + maxTaskCounts);} }

二刷

  • 誒嘿,二刷終于是有了更好理解了,對于最后一行的return:
  • 如果說數量足夠多,那么就相當于無空閑時間,直接取最大的 task.length 即可
  • 如果說數量不夠,那么 length 鐵定不能取,同時也肯定小于有空閑公式的值。
  • 因此總的來說,得 max !
class Solution {public int leastInterval(char[] tasks, int n) {int maxRow = 0;int[] counts = new int[26];for(char c : tasks) {counts[c - 'A']++;maxRow = Math.max(counts[c - 'A'], maxRow);}int maxCol = 0;for(int element : counts) {if(element == maxRow) {maxCol++;}}return Math.max(tasks.length, (maxRow - 1) * (n + 1) + maxCol);} }

總結

以上是生活随笔為你收集整理的【LeetCode笔记】621. 任务调度器(Java、桶)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。