|
1 | 1 | class Solution {
|
2 | 2 | public int minEatingSpeed(int[] piles, int h) {
|
3 |
| - int minBananaCount = 1; |
4 |
| - int maxBananaCount = maxFromPile(piles); |
5 |
| - while (minBananaCount < maxBananaCount) { |
6 |
| - int mid = (minBananaCount + maxBananaCount) / 2; |
7 |
| - if (canFinishPile(piles, mid, h)) { |
8 |
| - maxBananaCount = mid; |
| 3 | + int start = 1; |
| 4 | + int end = 0; |
| 5 | + for (int pile : piles) { |
| 6 | + end = Math.max(end, pile); |
| 7 | + } |
| 8 | + while (start <= end) { |
| 9 | + int mid = start + (end - start) / 2; |
| 10 | + if (isPossible(piles, mid, h)) { |
| 11 | + end = mid - 1; |
9 | 12 | } else {
|
10 |
| - minBananaCount = mid + 1; |
| 13 | + start = mid + 1; |
11 | 14 | }
|
12 | 15 | }
|
13 |
| - return minBananaCount; |
| 16 | + return start; |
14 | 17 | }
|
15 | 18 |
|
16 |
| - private boolean canFinishPile(int[] piles, int bananaPerHour, int totalHours) { |
17 |
| - int totalTime = 0; |
| 19 | + private boolean isPossible(int[] piles, int k, int h) { |
| 20 | + int numOfHours = 0; |
18 | 21 | for (int pile : piles) {
|
19 |
| - int numOfHours = pile / bananaPerHour; |
20 |
| - totalTime += numOfHours == 0 ? 1 : numOfHours; |
21 |
| - totalTime += numOfHours > 0 && pile % bananaPerHour != 0 ? 1 : 0; |
22 |
| - } |
23 |
| - return totalTime <= totalHours; |
24 |
| - } |
25 |
| - |
26 |
| - private int maxFromPile(int[] piles) { |
27 |
| - int maxCount = piles[0]; |
28 |
| - for (int i = 1; i < piles.length; i++) { |
29 |
| - maxCount = Math.max(maxCount, piles[i]); |
| 22 | + numOfHours += Math.ceil((double) pile / k); |
30 | 23 | }
|
31 |
| - return maxCount; |
| 24 | + return numOfHours <= h; |
32 | 25 | }
|
33 | 26 | }
|
0 commit comments