被裁不给交接时间当天就让滚蛋,离职后同组的领导同事反复微信电话问项目问题,还让一起拉群拉会看问题,怎么办?直接拉黑?
算法题:零钱兑换
def coinChange(coins, amount):
# 初始化dp数组,dp[i]表示凑成金额i所需的最小硬币数
dp = [float('inf')] * (amount + 1)
dp[0] = 0 # 凑成金额0不需要硬币,硬币数是0# 遍历每个金额
for i in range(1, amount + 1):
for coin in coins:
if i - coin >= 0:
dp[i] = min(dp[i], dp[i - coin] + 1)return dp[amount] if dp[amount] != float('inf') else -1
dp数组,dp[i]表示凑成金额i所需的最小硬币数。然后,我们通过每种硬币面额来更新dp数组。如果用某种硬币能凑出更少的硬币数,就更新dp[i]。解释一下这个代码的工作原理:
初始化 dp数组,大小是amount + 1,因为金额从0到amount都有可能。初始值设置为无穷大,表示无法用某些硬币组合成这个金额。dp[0]设为0,因为凑成金额0不需要任何硬币。然后,遍历每个金额 i,对于每种硬币面额coin,判断当前金额i能否通过减去硬币coin得到一个已经计算过的金额。若是,可以更新dp[i]的值为更小的硬币数。最后返回 dp[amount],如果它依然是无穷大,说明无法凑出该金额,返回-1。
coins = [1, 2, 5],amount = 11,执行完上面的代码后,dp[11]的值会是3,表示最少需要3个硬币(如:5+5+1)。动态规划的时间复杂度分析:
O(amount * len(coins)),因为对于每一个金额,我们都要遍历一次所有的硬币面额。如果金额amount很大,硬币面额很多,可能会导致计算量稍大,但总体来说这个算法效率还算可以。对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。