Swift解决零钱兑换问题(贪心算法)

857 阅读2分钟

最近在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

}

到这里全部代码结束。

这就是我对这个题的一些思路,希望能对大家有所启发。