• [Swift]LeetCode322. 零钱兑换 | Coin Change


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10260678.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

    Example 1:

    Input: coins = [1, 2, 5], amount = 11
    Output: 3 
    Explanation: 11 = 5 + 5 + 1

    Example 2:

    Input: coins = [2], amount = 3
    Output: -1
    

    Note:
    You may assume that you have an infinite number of each kind of coin.


    给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1

    示例 1:

    输入: coins = [1, 2, 5], amount = 11
    输出: 3 
    解释: 11 = 5 + 5 + 1

    示例 2:

    输入: coins = [2], amount = 3
    输出: -1

    说明:
    你可以认为每种硬币的数量是无限的。


    148ms

     1 class Solution {
     2     func coinChange(_ coins: [Int], _ amount: Int) -> Int {
     3        if amount == 0 {
     4             return 0
     5         }
     6         if amount < 0 {
     7             return -1
     8         }
     9         var nums = [Int].init(repeating: -1, count: amount+1)
    10         nums[0] = 0
    11         
    12         for i in 0..<amount {
    13             if nums[i] == -1 {
    14                 continue
    15             }
    16             for j in 0..<coins.count{
    17                 let k = i + coins[j]
    18                 if k <= amount && (nums[k] == -1 || nums[k] > nums[i] + 1) {
    19                     nums[k] = nums[i] + 1
    20                 }
    21             }
    22             
    23         }
    24         return nums[amount]
    25     }
    26 } 

    324ms

     1 class Solution {
     2     func coinChange(_ coins: [Int], _ amount: Int) -> Int {
     3         guard amount > 0 else {
     4             return 0
     5         }
     6         var dp = [0]
     7         for i in 1...amount {
     8             dp.append(amount + 1)
     9             for j in 0..<coins.count {
    10                 if i >= coins[j] {
    11                    dp[i] = min(dp[i], (dp[i - coins[j]] + 1))
    12                 }
    13             }
    14         }
    15         return dp[amount] == (amount + 1) ? -1 : dp[amount]
    16     }
    17 }

    408ms

     1 class Solution {
     2     func coinChange(_ coins: [Int], _ amount: Int) -> Int {
     3         if amount <= 0 { return 0 }
     4         var dp = [Int](repeating: Int.max, count: amount + 1)
     5         dp[0] = 0
     6         for i in 1 ... amount {
     7             for j in 0 ..< coins.count {
     8                 let coin = coins[j]
     9                 if coin <= i {
    10                     if dp[i - coin] == Int.max {
    11                         continue
    12                     } else {
    13                         dp[i] = min(dp[i], dp[i - coin] + 1)
    14                     }
    15                 }
    16             }
    17         }
    18         if dp[amount] == Int.max {
    19             return -1
    20         } else {
    21             return dp[amount]
    22         }
    23     }
    24 }

    864ms

     1 class Solution {
     2     func coinChange(_ coins: [Int], _ amount: Int) -> Int {
     3         if amount == 0 {
     4             return 0
     5         }
     6         var changes = Array(repeating: amount+1, count: amount+1)
     7         changes[0] = 0
     8         
     9         for i in 1...amount{
    10             for c in coins {
    11                 if i - c >= 0 {
    12                     changes[i] = min(changes[i], changes[i-c] + 1)
    13                 }
    14             }
    15         }
    16         
    17         return changes[amount] == amount + 1 ? -1 : changes[amount]
    18     }
    19 }

    936ms

     1 class Solution {
     2     func coinChange(_ coins: [Int], _ amount: Int) -> Int {
     3         guard amount > 0 else {
     4             return 0
     5         }
     6 
     7         var count = Array(repeating: 0, count: amount)
     8         return coinChange(coins, amount, &count)
     9     }
    10 
    11     func coinChange(_ coins: [Int], _ rem: Int, _ count: inout [Int]) -> Int {
    12         guard rem >= 0 else {
    13             return -1
    14         }
    15 
    16         guard rem != 0 else {
    17             return 0
    18         }
    19 
    20         guard count[rem - 1] == 0 else {
    21             return count[rem - 1]
    22         }
    23 
    24         var min = Int.max
    25         for coin in coins {
    26             let res = coinChange(coins, rem - coin, &count)
    27             if res >= 0 && res < min {
    28                 min = res + 1
    29             }
    30         }
    31         count[rem - 1] = min == Int.max ? -1 : min
    32         return count[rem - 1]
    33     }
    34 }

    1048ms

     1 class Solution {
     2     func coinChange(_ coins: [Int], _ amount: Int) -> Int {
     3     var coinsArr = coins.sorted(by: {
     4         $0 > $1
     5     })
     6     
     7    if (amount == 0)  {
     8        return 0; 
     9    }
    10   
    11    // Initialize result 
    12    var res = Int.max; 
    13         var lookupRes:[Int:Int] = [:]
    14         for var i in 1...amount+1 {
    15             lookupRes[i] = Int.max
    16         }
    17   
    18    lookupRes[0]  = 0
    19    for amountIndex in 1...amount {
    20        for var i in 0..<coins.count
    21        { 
    22            if (coins[i] <= amountIndex) 
    23            { 
    24                let newAmount = amountIndex - coins[i]
    25                let sub_res = lookupRes[newAmount]!
    26                if (sub_res != Int.max && sub_res + 1 < lookupRes[amountIndex]!)  {
    27                    lookupRes[amountIndex] = sub_res + 1; 
    28                }
    29            } 
    30        } 
    31    }
    32     
    33    if( lookupRes[amount]! == Int.max) {
    34        return -1
    35    }
    36         return lookupRes[amount]!
    37     }
    38 }

     4164ms

     1 class Solution {
     2     func coinChange(_ coins: [Int], _ amount: Int) -> Int {
     3         guard amount > 0 else {
     4             return 0
     5         }
     6         
     7         var nums = [Int : Int]()
     8         for i in 1...amount {
     9             nums[i] = -1
    10         }
    11         for coin in coins {
    12             nums[coin] = 1
    13         }
    14         
    15         for i in 1...amount {
    16             if let cur = nums[i], cur == -1 {
    17                 for coin in coins {
    18                     if let target = nums[i - coin], target != -1 {
    19                         if nums[i] == -1 {
    20                             nums[i] = target + 1
    21                         } else {
    22                             nums[i] = min(target + 1, nums[i] ?? 0)
    23                         }
    24                     }
    25                 }
    26             }
    27         }
    28         return nums[amount] ?? 0
    29     }
    30 }
  • 相关阅读:
    指针与数组关联导致的一些现象 分类: H_HISTORY 20130211 20:14 516人阅读 评论(0) 收藏
    宏定义一些内容 分类: H_HISTORY 20130207 23:20 585人阅读 评论(0) 收藏
    使用lstat()判断文件类型 分类: H_HISTORY 20130224 11:48 703人阅读 评论(0) 收藏
    关于VMware虚拟机的上网 分类: C_OHTERS 20130220 14:36 336人阅读 评论(0) 收藏
    Segmentation fault (core dumped) 分类: H_HISTORY 20130206 11:34 18800人阅读 评论(0) 收藏
    C语言内存分配时间 分类: H_HISTORY 20130211 10:51 1432人阅读 评论(3) 收藏
    GTK+与QT的对比 分类: H_HISTORY 20130205 09:27 3101人阅读 评论(0) 收藏
    枚举作为整数 分类: H_HISTORY 20130208 11:22 576人阅读 评论(0) 收藏
    01背包问题,动态规划求解
    求两个字符串的相似度或子串
  • 原文地址:https://www.cnblogs.com/strengthen/p/10260678.html
Copyright © 2020-2023  润新知