← 返回目录

算法笔试模拟题精解之“钱庄”

第 9 / 74 卷日期:

算法笔试模拟题精解之“钱庄”

贡献者 | 张鹏飞

简介:可以先分析示例是如何实现的,以此为突破点。

题目描述

等级:中等

知识点:贪心

查看题目:钱庄

钱庄每天能够收到很多散钱,第 i 个散钱的值 2^wi。为了便于管理,钱庄每天都

会向中央银行申请兑换钱币,假设钱庄有一些散钱使得 2^k1+2^k2+...+2^km=2^x

(x 为非负整数),那么就可以将这些散钱兑换成一个大钱币,问在钱庄收到的这些散

钱最终最少能变成几个钱币?

输入一个整数 n,表示一共有 n 个钱币 (1 <= n <= 10^6);再输入 n 个整数 wi,

表示有价值 2^wi(0 <= wi <= 10^6) 的钱币。

输出兑换后最少的钱币数

示例 1

输入:

4

[1, 1, 2, 3]

输出:

1

注意

2^1+2^1+2^2+2^3=2^4,因此兑换后最少为一个钱币

解题思路一

大致思路:对于 [1, 1, 2, 3] 样例,答案 1 是怎么算出来的?按照题目的思路,应

该这样算:2^1+2^1+2^2+2^3=2^4, 因此为 1,但是如果这样做,肯定会超时,我是

这样算的:对于底数为 2 幂数相同的两个数想加,是不是底数不变,幂加 1,因此两

个 1 组成一个 2,此时共有两个 2,这两个 2 组成一个 3,此时共有两个 3,两个三

组成一个 4,最后只剩一个 4,因此答案为 1.

具体过程:遍历一遍 m 找出 m 中的最大数 max,定义一个数组 arr[max+2],

用于统计出 m 数组中,每个数字出现的次数,即 arr[m[i]]++(m 中的元素为下标,

arr 数组中保存出现的次数);

再次遍历 arr 数组 (0<=i<=max),如果当前元素 arr[i]==0,那就下一个,

如果不为 0,arr[i+1]+=arr[i]/2;( 每两个 arr[i] 就能凑一个 arr[i+1])

如果 arr[i] 为奇数,那说明剩余一个 arr[i],这最后也就剩下了,所以 ans++;

遍历完后 if(arr[max+1]!=0) ans++; 然后 return ans;

注意:加粗部分一定要理解

解题思路二:贪心

遍历钱币数组 m, 只要数组中的当前元素 x 可以兑换一个大金币 ( 有两个以上相

遍历结束后 , 对剩下的钱币个数做统计 ( 而上述操作保证了所有钱币均不可兑换 );

复杂度分析

空间复杂度

开辟了 100000 大小的 map 数组 ( 因为价值 wi 取值为 :0 <= wi <= 10^6)

所以空间复杂度为 : O(100000) ~ O(1)

时间复杂度

针对钱币数组遍历一次 , 每一次会做自底向上的钱币转换遍历 ;

所以最差情况下时间复杂度 , 每次都会自底向上发生转换 ;

所以时间复杂度最差为 : O(n^2),其中 n 为钱币数 ;

看完之后是不是有了想法了呢,快来练练手吧 >> 查看题目:钱庄

全站分卷索引 · 74 卷
  1. 1一、算法思想
  2. 2算法笔试模拟题精解之“打怪兽”
  3. 31.2 贪心
  4. 4算法笔试模拟题精解之“最强的团队”
  5. 5算法笔试模拟题精解之“Tom 爱吃巧克力”
  6. 6算法笔试模拟题精解之“吃奶酪”
  7. 7算法笔试模拟题精解之“一的个数”
  8. 8算法笔试模拟题精解之“Bob 的花束”
  9. 9算法笔试模拟题精解之“钱庄”
  10. 10算法笔试模拟题精解之“移动射击”
  11. 11算法笔试模拟题精解之“相似数组”
  12. 12算法笔试模拟题精解之“过吊桥”
  13. 13算法笔试模拟题精解之“完美排列”
  14. 14算法笔试模拟题精解之“采摘圣诞果”
  15. 15算法比赛模拟题精解之“Tairitsu and Dynamic Objects”
  16. 16算法笔试模拟题精解之“Codancer 的炸弹引爆”
  17. 17算法笔试模拟题精解之“学习小组”
  18. 18算法笔试模拟题精解之“恢复字符串”
  19. 191.3 DP/ 动态规划
  20. 20算法笔试模拟题精解之“寻找等比数列”
  21. 21算法笔试模拟题精解之“字符配对”
  22. 22算法笔试模拟题精解之“数组染色”
  23. 23算法笔试模拟题精解之“连绵的群山”
  24. 24算法笔试模拟题精解之“难住Tom 的问题”
  25. 25算法笔试模拟题精解之“变化的字符”
  26. 26算法笔试模拟题精解之“跳房子”
  27. 27算法笔试模拟题精解之“寒假活动”
  28. 28算法笔试模拟题精解之“最短路”
  29. 29算法笔试模拟题精解之“codancer 上楼”
  30. 30算法笔试模拟题精解之“木棒拼接”
  31. 31算法笔试模拟题精解之“Codancer 的数组封印”
  32. 32算法笔试模拟题精解之“Jerry 的异或运算”
  33. 33算法笔试模拟题精解之“小明的数学作业”
  34. 34算法笔试模拟题精解之“奇偶数列”
  35. 351.4 剪枝
  36. 361.5 尺取法
  37. 37算法笔试模拟题精解之“调整数组”
  38. 38算法笔试模拟题精解之“最优分组”
  39. 39算法笔试模拟题精解之“破译密码”
  40. 40二、数据结构
  41. 412.2 搜索
  42. 42算法笔试模拟题精解之“能量半径”
  43. 43算法笔试模拟题精解之“苹果收获程序”
  44. 44算法笔试模拟题精解之“恐怖的辐射”
  45. 45算法笔试模拟题精解之“树的拆分”
  46. 46算法笔试模拟题精解之“Password”
  47. 47算法笔试模拟题精解之“神奇数字在哪里”
  48. 48算法笔试模拟题精解之“神奇的棋子”
  49. 492.3 树
  50. 50算法笔试模拟题精解之“Codancer 的旅行”
  51. 51算法笔试模拟题精解之“Codancer 的求和”
  52. 52算法笔试模拟题精解之“找出二叉搜索树的第2 大的数”
  53. 532.4 线型
  54. 54算法笔试模拟题精解之“最活跃的数”
  55. 55算法笔试模拟题精解之“非递减序列”
  56. 56算法笔试模拟题精解之“Tom 跳方格”
  57. 57算法笔试模拟题精解之“复杂的字符串”
  58. 58算法笔试模拟题精解之“神秘消失”
  59. 59三、计算
  60. 60算法笔试模拟题精解之“简单题?
  61. 61算法笔试模拟题精解之“朋友一生一起走”
  62. 62算法笔试模拟题精解之“正三角塔”
  63. 63算法笔试模拟题精解之“组队难题”
  64. 64算法笔试模拟题精解之“2n 合体”
  65. 65算法笔试模拟题精解之“平行线”
  66. 66算法笔试模拟题精解之“叠叠高”
  67. 67算法笔试模拟题精解之“公平”
  68. 68算法笔试模拟题精解之“Tom 的手工课”
  69. 69算法笔试模拟题精解之“填数问题”
  70. 70算法笔试模拟题精解之“Jerry 的考验”
  71. 71算法笔试模拟题精解之“超车”
  72. 72算法笔试模拟题精解之“坏掉的时钟”
  73. 73算法笔试模拟题精解之“期末考试”
  74. 74算法笔试模拟题精解之“滑雪比赛”