Koko loves to eat bananas. There are n
piles of bananas, the ith
pile has piles[i]
bananas. The guards have gone and will come back in h
hours.
Koko can decide her bananas-per-hour eating speed of k
. Each hour, she chooses some pile of bananas and eats k
bananas from that pile. If the pile has less than k
bananas, she eats all of them instead and will not eat any more bananas during this hour.
Koko likes to eat slowly but still wants to finish eating all the bananas before the guards return.
Return the minimum integer k
such that she can eat all the bananas within h
hours.
Example 1:
Input: piles = [3,6,7,11], h = 8
Output: 4
Example 2:
Input: piles = [30,11,23,4,20], h = 5
Output: 30
Example 3:
Input: piles = [30,11,23,4,20], h = 6
Output: 23
Constraints:
1 <= piles.length <= 104
piles.length <= h <= 109
1 <= piles[i] <= 109
코코는 바나나를 먹는 것을 좋아합니다. 바나나 더미가 n
개 있으며, i
번째 더미에는 piles[i]
개의 바나나가 있습니다. 경비원들이 떠났다가 h
시간 후에 돌아옵니다.
코코는 시간당 바나나 먹는 속도 k
를 결정할 수 있습니다. 매 시간마다, 그녀는 바나나 더미를 하나 고르고 그 더미에서 k
개의 바나나를 먹습니다. 만약 더미에 k
개보다 적은 바나나가 있다면, 그녀는 그 모든 바나나를 다 먹고 그 시간 동안 더 이상 바나나를 먹지 않습니다.
코코는 천천히 먹기를 좋아하지만 경비원이 돌아오기 전에 모든 바나나를 다 먹고 싶어 합니다.
경비원이 돌아오는 시간 h
시간 내에 모든 바나나를 먹을 수 있도록 최소 정수 k
를 반환하세요.
예시 1:
입력: piles = [3,6,7,11], h = 8
출력: 4
예시 2:
입력: piles = [30,11,23,4,20], h = 5
출력: 30
예시 3:
입력: piles = [30,11,23,4,20], h = 6
출력: 23
제약 조건:
1 <= piles.length <= 104
piles.length <= h <= 109
1 <= piles[i] <= 109
import java.util.Arrays;
class Solution {
public int minEatingSpeed(int[] piles, int h) {
int left = 1;
int right = Arrays.stream(piles).max().getAsInt(); // 배열 중 최댓값을 한 번만 계산합니다.
while (left <= right) {
int mid = (left + right) / 2;
long k = 0;
for (int p : piles) {
k += (p + mid - 1) / mid; // 올림 계산을 효율적으로 수행
}
if (k <= h) {
right = mid - 1; // k가 h 이하면 k를 줄여 더 작은 속도를 탐색
} else {
left = mid + 1; // k가 h보다 크면 k를 늘려야 하므로 더 큰 속도를 탐색
}
}
return left; // 최소 k 값 반환
}
}