思路
对问题进行解析,找到最小符合的k
,那么怎么样才是符合的k
呢?就是遍历piles
数组将它除以k
,向上取整。如果累加的和是小于等于h
那么就是合法的。
当我们的k从小到大进行变化的话,那么整体的累加的和就会单调递减,有了单调性就可以使用二分查找了,这里我们使用二分答案。
check
函数计算piles[i] / h
向上取整的和。
- 当计算出来的和是小于等于
h
的话,说明mid
的值是大,说明是在右区间的,将r = mid
- 当计算出来的和是大于
h
,那么将l = mid + 1
技巧,在处理向上取整可以使用a / b
==> a + b - 1 / b
就可以达到向上取整了
代码
class Solution {
public int minEatingSpeed(int[] piles, int h) {
int l = 1;
int r = (int)1e9;
while (l < r) {
int mid = (l + r) >> 1;
// 如果计算的值是小于等于h说明mid可能是比较大的
if (check(piles, mid) <= h) r = mid;
else l = mid + 1;
}
return l;
}
public static int check(int[] p, int mid) {
int res = 0;
for (int i : p) {
// 技巧向上取整 x + mid - 1 / mid
res += (i + mid - 1) / mid;
}
return res;
}
}