寻找左侧边界
int left_bound(int[] nums, int target){
int left = 0;
int right = nums.length;
while(left < right){
int mid = left + (right-left) / 2;
if(nums[mid] = target){
right = mid;
}else if(nums[mid] < right){
left = mid + 1;
}else if(nums[mid] > target){
right = mid;
}
}
return left;
}
寻找右侧边界
int right_bound(int[] nums, int target){
int left = 0;
int right = nums.length;
while(left < right){
int mid = left + (right-left) / 2;
if(nums[mid] = target){
left = mid + 1;
}else if(nums[mid] < right){
left = mid + 1;
}else if(nums[mid] > target){
right = mid;
}
}
return left - 1;
}
N堆香蕉,第i堆有piles[i]跟香蕉,H小时吃掉所有香蕉的最小速度K,一小时最多吃掉一堆香蕉
最少速度为1,最大速度为max[piles[i]]
int minEatingSpeed(int[] piles,int H){
int left = 1;
int right = getMax(piles) + 1;
while(left < right){
int speed = left + (right-left)/2;
if(canFinish(speed,piles,H){
right = speed;
}else{
left = speed + 1;
}
}
retrun left;
}
int getMax(int[] piles){
int max = 0;
for(int i = 0; i < piles.length; i++){
max = Math.max(piles[i],max);
}
retrun max;
}
boolean canFinish(int speed,int[] piles, int H){
int costTime = 0;
for(int i = 0; i < speed.length; i++){
costTime += getCostTime(speed,piles[i]);
}
return costTime <= H;
}
int getCostTime(int speed, int pile){
retrun pile/speed+(pile % speed > 0 ? 1 : 0);
}
扩展:运输问题,传送带上的第i个包裹的重量为weights[i], D天内能将传送带上的所有包裹送达的最低运载能力
最大值为sum(weights),最小值为max(weights)
int shipWihinDays(int[] weights,int D){
int left = getMax(weights);
int right = getSum(weights) + 1;
while(left < right){
mid = left + (right -left) / 2;
if(canFinish(mid,weights,D)){
right = mid;
}
else{
left = mid + 1;
}
}
return left;
}
boolean canFinish(int cap, int[] weights, int D){
int i = 0;
//判断D天内是否能完成任务
for(int day=0;day<D;day++){
int maxCap = cap;
//剩下的载重能否装下下次货物,因为按顺序放,放不下就第二天
while((maxCap -= weight[i]>0){
i++;
if(i == w.length)
return true;
}
}
return false;
}
int getSum(int[] weights){
int sum = 0;
for(int i = 0; i < weights.length; i++){
sum += weights[i];
}
return sum;
}
int getMax(int[] weights){
int max = 0;
for(int i = 0; i < weights.length; i++){
max = Math.max(max,weights[i]);
}
retrun max;
}