思路:
题目的主要信息:
- 一共
辆货车,每辆容量为
,需要运送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; 复杂度分析:
- 时间复杂度:
,一次遍历,最坏情况(
)第二个循环相当于是差值的对数运算
- 空间复杂度:
,常数空间

京公网安备 11010502036488号