科科喜欢吃香蕉。有n堆香蕉,第i堆有piles[i]根香蕉。警卫已经走了,h小时后就会回来。
Koko 可以决定她每小时吃香蕉的速度 k。每个小时,她都会选择一些香蕉并从该堆中吃掉 k 个香蕉。如果这堆香蕉少于 k 个,她会吃掉所有香蕉,并且在这一小时内不会再吃更多香蕉。
科科喜欢慢慢吃,但仍然想在守卫回来之前吃完所有香蕉。
返回最小整数k,使得她可以在h小时内吃完所有香蕉。
示例1:
输入:桩 = [3,6,7,11], h = 8
输出:4示例2:
输入:桩 = [30,11,23,4,20], h = 5
输出:30示例3:
输入:桩 = [30,11,23,4,20], h = 6
输出:23
import java.util.Arrays;
class Solution {
public int minEatingSpeed(int[] piles, int h) {
Arrays.sort(piles);
int j = 0;
int high = piles[piles.length-1];
int i = 0;
int k;
outerLoop1:
for( k = piles[0]; k <= high; k++) {
while (j <= h && i < piles.length) {
if (piles[i] > 0) {
piles[i] = piles[i] - k;
}
j++;
i++;
if (i == piles.length) {
i = 0;
}
}
outerLoop:
if (j == h) {
int f = 0;
while (f < piles.length) {
if (piles[i] > 0) {
break outerLoop;
} else {
f++;
}
}
break outerLoop1;
}
}
return k;
}
}
我知道我应该使用二分搜索来解决这个问题,但我采用了不同的方法。
我从 k 的最低值(即堆中的最低 val)开始运行 for 循环,一直到最高的值,在堆中的所有内容都为 0 或 1 时返回 k(在从中重复减去 k 之后) )。如果情况并非如此,我会增加 k 并重试。据我了解,break outerLoop 脱离了 if 语句,并且 k 递增。而break outerLoop1 脱离了 k 的最外层 for 循环并且返回了 k,因为我找到了我需要的 k 的值。
我的逻辑有什么问题吗?
我不需要这个问题的解决方案,只需澄清我的特定版本的代码究竟出了什么问题,以及我可以进行哪些调整来修复它,按照我现在的方式处理它。
我从 k 的最低值(即堆中的最低 val)开始运行 for 循环
为什么 k 的最小可能值是堆中的最小值?举个例子:
piles={8};h=8
。这里,最小值是 1,但你的算法永远不会检查这种情况,因为它从 8 开始检查。