輸入為一陣列,陣列不為空陣列且元素皆為正整數。每個元素代表一個任務的執行時間,一次只能執行一個任務,但順序可以換。
若每個任務的等待時間代表執行前須等的時間,回傳執行所有任務需要的最短等待時間總和。可以操作輸入陣列。
sample input:
queries = [3, 2, 1, 2, 6]
sample output:
17
以三個任務的情況來說,等待時間總和的計算方式是:第一個任務不需要等待可以立刻執行,第二個任務需等待第一個任務執行完,第三個任務需等待第一 + 第二個任務執行完。因此陣列 = [100, 1, 4],等待時間總和為 0 + 100 + (100 + 1) = 201。
從這個的例子可以看出,順序越前面的任務,會被後面越多的任務等待。例如最先執行需要 100 時間的任務,則後面每個任務的等待時間都會加 100。換句話說,最佳的執行順序應該是將時間從少到多排序,而這也是一種貪婪演算法,因為每一步一定都要選當前時間最少的任務執行,才會得到整體最佳解。
具體的步驟是:
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;
}