2024.1.27
- 题目来源
- 我的题解
- 方法一 二分查找
题目来源
力扣每日一题;题序: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;
}
有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~