1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public int minEatingSpeed(int[] piles, int h) {
int left = 1, right = piles[0];
for (int i = 1; i < piles.length; i++) {
right = Math.max(right, piles[i]);
}
int ans = right;
while (left <= right) {
int mid = left + (right - left) / 2;
long count = 0;
for (int pile : piles) {
count += pile / mid;
count += pile % mid == 0 ? 0 : 1;
// count += Math.ceil((double) pile / mid);
}
if (count <= h) {
ans = mid;
right = mid - 1;
} else {
left = mid + 1;
}
}
return ans;
}
}

Binary Search.
最大的速度就是piles里面的最大值, 这能保证每一个pile都是1小时搞定, 最小的速度就是1. 然后就binary search就完事儿了.

需要注意的是count需要声明为long类型, 否则可能会overflow.

当然可以用Math.ceil()这个method, 我们给定一个double类型的数字, 它能告诉我们比该数字大的数字中最小的整数double是多少. 和它相对应的还有Math.floor(), 我们同样给定一个double数字, 它能告诉我们比该数字小的数字中最大的整数double是多少.

时间复杂度: O(nlogm) n是piles的长度, m是piles中的最大值. 因为我们每次都要遍历piles中的每个数字, 一共遍历logm次.
空间复杂度: O(1)