楼主: BubbleFan
跳转到指定楼层
上一主题 下一主题
收起左侧

[高频题] 4.26Amazon视频面试:coin change的变种

全局:
DP的做法,代码比较糙,但是能跑对,目前还没有遇到不正确的case,欢迎各位同学指正。

  1. import sys

  2. class Solution:
  3.     def coin_change(self, coins, nums, amount):
  4.         # 一共有多少个硬币,给硬币编号
  5.         total = 0
  6.         for n in nums:
  7.             total += n

  8.         # 先初始化成 一维数组
  9.         dp = [0] * total

  10.         index = 0
  11.         while index < total:
  12.             dp[index] = [0] + [sys.maxsize] * amount
  13.             index += 1

  14.         money = []
  15.         for i, c in enumerate(coins):
  16.             money += [c] * nums[i]

  17.         # dp[i][j] 是说,编号是 i 的硬币可以参与 (只有两个选择,用上这个硬币,或者不用) 的时候, j 这么多钱最少要多少硬币
  18.         for i in range(0, total):
  19.             for j in range(0, amount + 1):
  20.                 if j - money[i] == 0:
  21.                     dp[i][j] = 1
  22.                 elif j - money[i] < 0:
  23.                     if (i >= 1):
  24.                         dp[i][j] = dp[i - 1][j]
  25.                 else:
  26.                     # 第一个硬币,没有更前面的一个硬币了,不用考虑,就是 sys.maxsize, 初始化的时候设置好了
  27.                     # 而且在一直用到前一个硬币的情况下,扣去现在考虑的这枚硬币的面值之后,还能有解决方案的时候
  28.                     # 就可以考虑哪一个方案用的硬币更少了
  29.                     if i != 0:
  30.                         if dp[i - 1][j - money[i]] != sys.maxsize:
  31.                             dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - money[i]] + 1)
  32.                         else:
  33.                             dp[i][j] = dp[i - 1][j]

  34.         return dp[total - 1][amount] if dp[total - 1][amount] != sys.maxsize else -1


  35. if __name__ == "__main__":
  36.     print(Solution().coin_change([1, 2, 5], [1, 1, 1], 8))
  37.     print(Solution().coin_change([1, 2, 5], [1, 8, 3], 16))
  38.     print(Solution().coin_change([7, 2, 5], [1, 5, 1], 8))
  39.     print(Solution().coin_change([1, 2, 5, 6], [1, 1, 1, 1], 8))
  40.     print(Solution().coin_change([7, 2, 5, 10], [2, 1, 1, 1], 14))
  41.     print(Solution().coin_change([7, 2, 5, 10], [1, 2, 1, 1], 14))
复制代码
回复

使用道具 举报

🔗
ggranked 2019-7-16 01:26:55 | 只看该作者
全局:
这有个网上的代码,是c++的

https://ideone.com/w4Z7Ul
回复

使用道具 举报

🔗
whodatj 2019-7-16 13:11:09 | 只看该作者
全局:
请问LZ面的什么级别的职位?
回复

使用道具 举报

🔗
 楼主| BubbleFan 2019-7-17 02:14:56 | 只看该作者
全局:
whodatj 发表于 2019-7-16 13:11
请问LZ面的什么级别的职位?

New Graduate的统招
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表