题目描述
思路:
通过题目我们可以看到以下限制条件
速度 k的 范围为 所有香蕉的和 / h <= k <= max(piles)
由于所有香蕉的和超出了int 范围,因此
优化后的范围为 0 <= k <= max(piles)
思路1.既然在一定的范围之内,我们就可以尝试暴力破解
从0开始,每一次都 k+=1 ,直到能够将香蕉吃完
思路2.当数据太大的时候,超出了时间范围,因此可以采用二分法进行查找
拿到一个数,这个速度能够吃完,right = k;不能吃完,left = k+1;k=left+(right-left)/2;
当然了,我们还得写一个函数判断能不能吃完
代码如下
class Solution {
public int minEatingSpeed(int[] piles, int h) {
int left = 1;
int right = 0;
for(int temp : piles)
{
right = Math.max(right,temp);
}
int k=0;
while(left<right)
{
k = left+(right - left)/2;
//写一个函数判断能不能吃完,并返回boolean
if(judge(piles,k,h))
{
//能吃完
right = k;
}
else
{
left = k+1;
}
}
return right;
}
public boolean judge(int []piles,int b,int h)
{
int count1=0;
for(int temp : piles)
{
int temp2 = (temp + b -1)/b;
count1 += temp2;
}
if(count1 > h)//吃不完
{
return false;
}
else
{
return true;
}
}
}
遇到的问题
1.for循环知识点的引用
for(int temp : piles)
{}
代替
for(int i=0;i<piles.length;i++)
{
int temp = piles[i];
}
2.计算每一堆吃的次数
while(temp > 0)
{
temp -= speed;
count1 ++;
}
替换为
temp = (temp-1 + speed ) /speed;
count1 += temp;
// temp-1 + speed 是为了保证 堆数小于速度时,保证次数为 1
//直接用 temp/speed 可能会出现吃了,但吃的次数为 0