• leetcode-每日一题-1710-卡车上的最大单元数(简单,哈希,暴力)


    今天的这道题其实很好读懂,因为很容易可以看出来暴力求解,但其实还是隐藏一个hash求解法很巧妙,因为我在很久之前就用过hash解答过这样类似的题,所以这个题也是可以使用的,可以看看我第二个hash解法

    目录

    暴力效率(效率低下):

    hash排版:


    请你将一些箱子装在 一辆卡车 上。给你一个二维数组 boxTypes ,其中 boxTypes[i] = [numberOfBoxesi, numberOfUnitsPerBoxi] :

    numberOfBoxesi 是类型 i 的箱子的数量。
    numberOfUnitsPerBoxi 是类型 i 每个箱子可以装载的单元数量。
    整数 truckSize 表示卡车上可以装载 箱子 的 最大数量 。只要箱子数量不超过 truckSize ,你就可以选择任意箱子装到卡车上。

    返回卡车可以装载 单元 的 最大 总数。

    示例 1:

    输入:boxTypes = [[1,3],[2,2],[3,1]], truckSize = 4
    输出:8
    解释:箱子的情况如下:
    - 1 个第一类的箱子,里面含 3 个单元。
    - 2 个第二类的箱子,每个里面含 2 个单元。
    - 3 个第三类的箱子,每个里面含 1 个单元。
    可以选择第一类和第二类的所有箱子,以及第三类的一个箱子。
    单元总数 = (1 * 3) + (2 * 2) + (1 * 1) = 8
    示例 2:

    输入:boxTypes = [[5,10],[2,5],[4,7],[3,9]], truckSize = 10
    输出:91
     

    提示:

    1 <= boxTypes.length <= 1000
    1 <= numberOfBoxesi, numberOfUnitsPerBoxi <= 1000
    1 <= truckSize <= 106

     暴力效率(效率低下):

    1. void sort(int *key,int *value,int size)
    2. {
    3. int i,j,e;
    4. for(i=0;i
    5. {
    6. for(j=i+1;j
    7. {
    8. if(value[i]
    9. {
    10. e=value[i];
    11. value[i]=value[j];
    12. value[j]=e;
    13. e=key[i];
    14. key[i]=key[j];
    15. key[j]=e;
    16. }
    17. }
    18. }
    19. }
    20. int maximumUnits(int** boxTypes, int boxTypesSize, int* boxTypesColSize, int truckSize){
    21. int i,j,k;
    22. int *key=(int*)malloc(sizeof(int)*boxTypesSize);
    23. int *value=(int*)malloc(sizeof(int)*boxTypesSize);
    24. memset(key,0,sizeof(key));
    25. memset(value,0,sizeof(value));
    26. for(i=0;i
    27. {
    28. key[i]=boxTypes[i][0];
    29. value[i]=boxTypes[i][1];
    30. }
    31. sort(key,value,boxTypesSize);
    32. int sum=0;
    33. for(i=0;i
    34. {
    35. if(truckSize-key[i]>0)
    36. {
    37. truckSize-=key[i];
    38. sum+=key[i]*value[i];
    39. }else{
    40. sum+=truckSize*value[i];
    41. break;
    42. }
    43. }
    44. return sum;
    45. }

     

     

    hash排版:

    hash其实我们都很熟悉我们了解hash数组,hash分组,hash分区等等,而且很多算法底层都有hash的身影,那么我们看看这题的hash思想是啥,其实主要就是对boxtypes这个数组进行排序,大的放在前面小的放在后面,我们从前面开始取,取到没有为止,那我们思路就清洗了,用max将当前的最大值进行记录,然后我们就可以减少循环次数,其实这个循环次数在3次左右几乎减少没减少区别不大,我们将hash初始化成0之后就可以使用了,只要将当前boy[i][0]的值放入我们的hash[i]里面,记住这里面是累加的状态而不是直接等的状态,这一点必须清楚,其次就是用sum进行求和了,就很简单了,注意细节即可

    1. int maximumUnits(int** boxTypes, int boxTypesSize, int* boxTypesColSize, int truckSize){
    2. int i,j,max=-1;
    3. int hash[1010];
    4. //int *hash=(int*)malloc(sizeof(int)*1010);
    5. memset(hash,0,sizeof(hash));
    6. for(i=0;i
    7. {
    8. hash[boxTypes[i][1]]+=boxTypes[i][0];
    9. max=fmax(max,boxTypes[i][1]);
    10. }
    11. int sum=0;
    12. for(i=max;i>=1;i--)
    13. {
    14. if(hash[i]!=0&&truckSize-hash[i]>0)
    15. {
    16. sum+=hash[i]*i;
    17. truckSize-=hash[i];
    18. //printf("i=%d hash[i]=%d sum=%d\n",i,hash[i],sum);
    19. }else if(hash[i]!=0&&truckSize-hash[i]<=0)
    20. {
    21. sum+=truckSize*i;
    22. //printf("i=%d hash[i]=%d sum=%d\n",i,hash[i],sum);
    23. break;
    24. }
    25. }
    26. return sum;
    27. }

     可以明显看到经过第二次hash调整之后,时间复杂度和空间复杂度都提升了很多

     

     

     

  • 相关阅读:
    GoogleNet架构解析
    SpringCloud使用Nginx代理、Gateway网关以后如何获取用户的真实ip
    通过IP地理位置阻止网络攻击
    SuperMap iClient3D for WebGL教程(S3MTilesLayer)- 显示优化设置
    如何在 Jenkins CI/CD 流水线中保护密钥?
    SpringMVC入门
    Palantir大数据技术在乌克兰战场的应用
    【RuoYi-Vue-Plus】学习笔记 41 - Easy Excel(一)Excel 2003(*.xls)导入流程分析(源码)
    C#餐饮收银系统
    6.29日刷题题解
  • 原文地址:https://blog.csdn.net/qq_59002046/article/details/127874304