iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0
自我挑戰組

30天演算法解題系列 第 15

Day 15:minimum waiting time

  • 分享至 

  • xImage
  •  

problem

輸入為一陣列,陣列不為空陣列且元素皆為正整數。每個元素代表一個任務的執行時間,一次只能執行一個任務,但順序可以換。

若每個任務的等待時間代表執行前須等的時間,回傳執行所有任務需要的最短等待時間總和。可以操作輸入陣列。

sample input:
queries = [3, 2, 1, 2, 6]

sample output:
17

以三個任務的情況來說,等待時間總和的計算方式是:第一個任務不需要等待可以立刻執行,第二個任務需等待第一個任務執行完,第三個任務需等待第一 + 第二個任務執行完。因此陣列 = [100, 1, 4],等待時間總和為 0 + 100 + (100 + 1) = 201。

從這個的例子可以看出,順序越前面的任務,會被後面越多的任務等待。例如最先執行需要 100 時間的任務,則後面每個任務的等待時間都會加 100。換句話說,最佳的執行順序應該是將時間從少到多排序,而這也是一種貪婪演算法,因為每一步一定都要選當前時間最少的任務執行,才會得到整體最佳解。

具體的步驟是:

  1. 由小到大排序陣列 array。
  2. 以一個變數 total 記錄等待時間總和。接著遍歷陣列,每執行一個任務,代表後面的所有任務都會等待它,將時間加進總和中。例如假設第一個任務為 2,則 total += (array.length - 1) * 2。
  3. 遍歷完陣列後,回傳 total。

n 為陣列長度,
time: O(nlogn)
space: O(1) 因為可以原地排序,不需要用到額外空間。

function minimumWaitingTime(queries) {
  queries.sort((a, b) => a - b);
  
  let total = 0;
  for (let i = 0; i < queries.length; i++) {
    const duration = queries[i];
    const queriesLeft = queries.length - (i + 1);
    total += duration * queriesLeft;
  }
  return total;
}

上一篇
Day 14:run-length encoding
下一篇
Day 16:class photo
系列文
30天演算法解題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言