珂珂喜歡吃香蕉。這里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警衛已經離開了,將在 H 小時后回來。
珂珂可以決定她吃香蕉的速度 K (單位:根/小時)。每個小時,她將會選擇一堆香蕉,從中吃掉 K 根。如果這堆香蕉少于 K 根,她將吃掉這堆的所有香蕉,然后這一小時內不會再吃更多的香蕉。
珂珂喜歡慢慢吃,但仍然想在警衛回來前吃掉所有的香蕉。
返回她可以在 H 小時內吃掉所有香蕉的最小速度 K(K 為整數)。
輸入:
參數1:piles: number[] 數組里面的值代表每一堆香蕉的根數;
參數2: H: number 輸入警衛離開的時間;
輸出:
輸出最小速度K;
示例 1:
輸入: piles = [3,6,7,11], H = 8
輸出: 4
示例 2:
輸入: piles = [3,6,7,13], H = 8
輸出: 5
示例 3:
輸入: piles = [23,30,12, 4], H = 5
輸出: 23
示例 4:
輸入: piles = [23,30,12, 4], H = 6
輸出: 15
/**
* @param piles{Array} 香蕉堆
* @param H{number} 警衛離開的時間H
* */
function minEatingSpeed(piles, H) {
if(H < piles.length) {
return '離開時間不能小于香蕉堆數';
}
if (piles.length === 1) {//特殊情況,只有一個堆,可直接獲取時間
return Math.ceil(piles[0] / H);
}
//按照香蕉數從小到大排序
const sortPiles = piles.sort(function (a, b) {
return a - b;
});
//初始化三個速度,最小速度,最大速度,中間速度
let left = 1, right = sortPiles[sortPiles.length - 1], mid;
while (left < right) {
mid = Math.floor((left + right) / 2);//折中向下取整
let needHours = 0;//計算以mid速度吃香蕉需要的總時間
for (let pile of sortPiles) {
//吃完一堆后,這一小時內不會再吃更多的香蕉,向上取整
needHours += Math.ceil(pile / mid);
}
if (needHours > H) {
//超過H,則說明我們吃慢了,增大左邊界
left = mid + 1;
} else {
//否則縮小右邊界
right = mid;
}
}
return left;
}
const K = minEatingSpeed([3,6,7,11], 8);
console.log("最小速度>>>>>>> ", K);