最近在leetcode看到一个算法题,https://leetcode-cn.com/problems/coin-change/ 零钱兑换问题,主要的意思是说用最少的硬币兑换指定的钱。
比如有1,2,5三种额度的硬币,要兑换10块的,最少的兑换数就是2,5,5两枚就可以了。
好了,我们知道规则了,那我们就来分析一下解题思路。
为了最少的硬币数,那我们就要用到贪心算法的思想,能用最大的,绝不换小的,如果最大的实在用不了,我们再考虑小一个额度的硬币,以此类推。直到完全兑换好。
接下来我们一步一步分析。
func coin(_ coins: [Int], sum: Int) -> Int {
let newCoins = coins.sorted() //排序
var count = 0 //返回的多少枚硬币
return count
}为了确保我们选择的是最大额度的硬币,首先我们给coins排个序,保证我们每次用到的一定是最大条件的额度硬币。接着我们先使用最大额度的硬币,如果最大额度的硬币比兑换的总额小,就用它,如果大了,就换小一点额度的硬币,直接上代码(这不是最终代码)
func coin(_ coins: [Int], sum: Int) -> Int {
let newCoins = coins.sorted()
var newSum = sum
var count = 0
var index = newCoins.count - 1
//如果能用最大的不用最小的,每用一次我们的计数+1
while newCoins[index] > newSum {
newSum = newSum - newCoins[index]
count = count + 1
}
return count
}
当我们不能使用大的,要使用小的时候,这个时候我们把index - 1,去使用小一点的值,然后一直按这种方式计算,直到index<0才结束(或者剩余的值<0,也是一样的效果)。
func coin(_ coins: [Int], sum: Int) -> Int {
let newCoins = coins.sorted()
var newSum = sum
var count = 0
var index = newCoins.count - 1
//剩余的值大于等于最小值才符合条件,或者index >= 0也行
//while index >= 0
while newSum >= newCoins[0] {
while newCoins[index] <= newSum {
print(newCoins[index])
newSum = newSum - newCoins[index]
count = count + 1
}
index = index - 1
}
return count
}
到这里全部代码结束。
这就是我对这个题的一些思路,希望能对大家有所启发。