思路:

题目的主要信息:

  • 一共辆货车,每辆容量为,需要运送n个鸡蛋
  • 如果装满货车后,还剩有鸡蛋,则选择一辆货车容量翻倍,继续装,如此循环
  • 同一辆车可以多次翻倍,求需要翻倍多少次

方法一:贪心+排序+差值运算
具体做法:
使用sort函数对数组排序,找到最大值。遍历数组x,对于每个,用减去容量,如果剩余鸡蛋数小于等于0,则不需要魔法返回0.如果最后还是大于0,我们选择增大容量最大的车,直到小于等于0.

class Solution {
public:
    int Holy(int n, int m, vector<int>& x) {
        int res = 0;
        sort(x.begin(), x.end());
        int maxx = x[m - 1]; //找到容量最大的车
        for(int i = 0; i < m; i++){
            if(x[i] > n)
                return 0;
            n -= x[i];
        }
        while(n > 0){
            n -= maxx; //每次选最大容量的车增加,增加数量为加倍前的容量 
            maxx *= 2;
            res++;
        }
        return res;
    }
};

复杂度分析:

  • 时间复杂度:,sort函数排序,遍历一次x数组,最坏情况()第二个循环相当于是差值的对数运算
  • 空间复杂度:,常数空间

方法二:贪心+增加计算
具体做法:
利用贪心思想,每次首先将所有的车直接装满的到所有车的容量,并在这时找到最大值。如果我们每次增加的是最大容量的车,直到能够达到
图片说明
C++版本

class Solution {
public:
    int Holy(int n, int m, vector<int>& x) {
        int maxx = 0;
        int res = 0;
        int sum = 0;
        for(int i = 0; i < m; i++){ 
            sum += x[i]; //求这些货车能装多少
            maxx = max(maxx, x[i]); //找到容量最大的车
        }
        while(sum < n){
            sum += maxx; //每次选最大容量的车增加,增加数量为加倍前的容量 
            maxx *= 2;
            res++;
        }
        return res;
    }
};

Python版本

class Solution:
    def Holy(self , n , m , x ):
        maxx = 0
        res = 0
        sumx = 0
        for i in range(m):
            sumx += x[i] #求这些货车能装多少
            maxx = max(maxx, x[i]) #找到容量最大的车
        while sumx < n :
            sumx += maxx #每次选最大容量的车增加,增加数量为加倍前的容量
            maxx *= 2;
            res += 1;
        return res;

复杂度分析:

  • 时间复杂度:,一次遍历,最坏情况()第二个循环相当于是差值的对数运算
  • 空间复杂度:,常数空间