题目:
牛妹是鸡蛋商人。由于疫情严重,于是牛妹准备向疫情地区捐赠n个鸡蛋。牛妹请了m辆货车来运送这些鸡蛋,其中第i辆货车能运输x[i]个鸡蛋。因为预料到货车可能装不下所有的鸡蛋,于是牛妹请来了哈利波特·牛,哈利波特·牛使用一次魔法可以来让一辆货车的容量翻倍,牛妹想知道最少需要哈利波特·牛出手几次?
方法一:贪心+差值运算
首先用货物去填充所有货车,并且找到最大容量的货车,如果剩余货物小于0,则不需要施加魔法,直接返回0;否则将容量最大的货车容量翻倍,继续填充货物,如果货物还有剩余,继续在上一次翻倍的基础上翻倍,直到剩余货物为0
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @param m int整型 * @param x int整型一维数组 * @return int整型 */ public int Holy (int n, int m, int[] x) { // write code here int max=x[0]; int cnt=0; //找到最大容量的货车 for(int i=0;i<m;i++){ max=Math.max(max,x[i]); n-=x[i];//所有货物减去货车容量 if(n<=0)return 0;//装得下,直接返回0 } //装不下 while(n>0){ n-=max; max*=2;//每次让最大货车容量翻倍 cnt++; } return cnt; } }
复杂度:
时间复杂度:第一个循环时间复杂度是,第二个循环: 因此时间复杂度为
空间复杂度:额外变量的空间为常数级,
方法二:贪心+增值运算
可以直接用排序函数得到货车容量最大值,当货车容量大于等于货物容量时,说明装得下,直接返回0
,如果装不下,每次让最大容量的货车容量翻倍,直到货车容量大于等于货物容量
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @param m int整型 * @param x int整型一维数组 * @return int整型 */ public int Holy (int n, int m, int[] x) { // write code here int cnt=0; //排序数组,直接得到最大容量的货车 Arrays.sort(x); int max=x[m-1],sum=0; for(int i=0;i<m;i++){ sum+=x[i]; if(sum>=n)return 0;//货车容量大于等于货物时,装得下,直接返回0 } //装不下 while(sum<n){ sum+=max;//货车容量增加 max*=2;//每次让最大货车容量翻倍 cnt++; } return cnt; } }
复杂度:
时间复杂度:第一个循环时间复杂度是O(m),第二个循环:
则第二个循环时间复杂度 ,加上排序函数的时间复杂度,因此最坏时间复杂度为
空间复杂度:额外变量的空间为常数级,