1.说点啥
总是算法,算法,算法,林林总总少说也有小两百道了,各种文章和书籍也看了一些。
看到钱币找零,还是一筹莫展。
得改变一下自己的学习思路和状态.
- 每刷一道题,要写出各种解法和时间空间复杂度。
- 一定要写总结,这个很重要!
2. 题目描述
这个问题在我们的日常生活中更加普遍。假设我们有 1 元、2 元、5 元、10 元、20 元、50 元、100 元这些面额的纸币,它们的张数分别是 c1、c2、c5、c10、c20、c50、c100。我们现在要用这些钱来支付 K 元,最少要用多少张纸币呢?
3. 总结
3.1 解题思路
- 贪心: 从面值最大的找,不够了依次往下。 局部解不是最优解,所以要枚举所有值才是真正的答案(也就是回溯法,穷举所有答案)
- 动态规划: 一张纸币最多达到多少金额,两张纸币最多达到做少金额,递归下去。。
3.2 总结
- 贪心不行。
- 回溯可以。
- 动态规划有一维数组和二维数组两种解法,一维数组有两种解法。
- 递归有递归和递归回忆录两种解法。
- 回溯和递归是一种解法,只不过一个是思想,一个是实现。
- 一共有六种解法,七种实现。
- 第七种实现,最优。
4. 解法
4.0 贪心算法
时间:指数级别。
空间:O(n)(递归的n次空间)
let coinChange = function (coins, amount, idxCoin = 0) {
coins = coins.sort((a, b) => b - a) // 排序
return _c(coins, amount, idxCoin)
}
let _c = function (arr, amount, count = 0) {
if (a