力扣每日一题;题序:2861
使用二分查找,下界为0,上界因为预算和已有金属最大上限是 1 0 8 10^8 108,所以设置二分查找上界为2* 1 0 8 10^8 108
时间复杂度:O(nklogC),其中 C 是答案的范围。二分查找需要的次数为 O(logC),每一次需要 O(nk)的时间进行判断。
空间复杂度:O(1)
public int maxNumberOfAlloys(int n, int k, int budget, List<List<Integer>> composition, List<Integer> stock, List<Integer> cost) {
int left=0,right=200000000,res=0;
while(left<=right){
int mid=((right-left)>>1)+left;
boolean hasValid=false;//用于标识是否有机器可以产mid个合金
//判断每一个机器
for(int i=0;i<k;i++){
if(check(n,composition,stock,cost,i,mid)<=budget){
hasValid=true;
break;
}
}
if(hasValid){
res=mid;
left=mid+1;
}else{
right=mid-1;
}
}
return res;
}
public long check(int n,List<List<Integer>> composition, List<Integer> stock, List<Integer> cost,int i,int mid){
long need=0;
for(int j=0;j<n;j++){
need+=Math.max((long)composition.get(i).get(j)*mid-stock.get(j),0)*cost.get(j);
}
return need;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈~