2024.1.27力扣每日一题——最大合金数

2024.1.27

      • 题目来源
      • 我的题解
        • 方法一 二分查找

题目来源

力扣每日一题;题序:2861

我的题解

方法一 二分查找

使用二分查找,下界为0,上界因为预算和已有金属最大上限是 1 0 8 10^8 108,所以设置二分查找上界为2* 1 0 8 10^8 108

时间复杂度:O(nklogC),其中 C 是答案的范围。二分查找需要的次数为 O(log⁡C),每一次需要 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;
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈~

你可能感兴趣的:(java,力扣每日一题,leetcode,算法,职场和发展,java)