通过万岁!!!
- 题目:就是给你一个数组,然后让你找到一个数k,使得数组中每个数/k向上取整的值之和最小。
- 思路:这里我的思路跟之前的双指针分巧克力是一样的,我们找到理论上的最小值,然后找到最大值,然后二分查找找到满足条件的最小的值即可。每次都去调用一个函数,判断当前的k(也就是代码中的mid),是不是满足全部吃完,如果满足,则说明k太大了,则右指针到mid,吃不完,则k太小了,则左指针右移。
- 技巧:双指针进行二分查找。
java代码
class Solution {
public int minEatingSpeed(int[] piles, int h) {
int len = piles.length;
int max = -1;
for (int i = 0; i < len; i++) {
max = Math.max(max, piles[i]);
}
if (h == len) {
return max;
}
// k最小的值应该是数组中最大的值/h,这时候我们只考虑最大的。如果还有其他的,那么速度一定还需要再快,所以这是k的最小值。
int l = max / h, r = max, mid;
while (l <= r) {
mid = l + (r - l) / 2;
int t = isEatAll(piles, h, mid);
if (t == -1) {
r = mid - 1;
} else {
l = mid + 1;
}
}
return l;
}
public int isEatAll(int[] piles, int h, int k) {
int t = 0;
for (int i = 0; i < piles.length; i++) {
if (piles[i] <= k) {
++t;
} else {
t += Math.ceil(piles[i] * 1.0 / k);
}
}
if (t <= h) {// 吃得完
return -1;
} else {// 吃不完
return 1;
}
}
}
- 总结:题目不是很难,但是我的效率并不高。