ARTS - 21 LeetCode 322 零钱兑换 | 分布式系统经典学习资料

ARTS

ARTS 是陈浩(网名左耳朵耗子)在极客时间专栏里发起的一个活动,目的是通过分享的方式来坚持学习。

每周写一个 ARTS:Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。

本周内容

Algorithm

这周的算法题是 DP 入门题: LeetCode 322 零钱兑换.

应该是动态规划最常见的题目之一了, 具体的解题思路可以先从递归的方式来. 即, 假定凑出总额为 i 所需的最少金币数量为 dp[i]. 那么 dp[i] = min(dp[i-coinA], dp[i-coinB], ...) + 1. 再转化到 DP 的思路, 上面的等式就是递推公式, base case 可以定义为 dp[0] = 0. 下面是代码:

func coinChange(coins []int, amount int) int {
    // dp[i] 代表总额是 i 时最少需要的硬币数量
    // dp[i] = min(dp[i-coinA], dp[i-coinB], ...) + 1
    dp := make([]int, amount+1)
    dp[0] = 0
    // 初始化为 amount+1 等价于设置初始值到无穷大, 因为总额 amount 时最多只需要 amount 个硬币
    for i := 1; i < amount+1; i++ {
        dp[i] = amount+1
    }

    for i := 1; i <= amount; i++ {
        for _, c := range coins {
            if i < c {
                continue
            }
            dp[i] = min(dp[i], dp[i-c]+1)
        }
    }
    if dp[amount] == amount+1 {
        return -1
    }
    return dp[amount]
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

Review 文章推荐

本周的文章是一份分布式系统学习的经典资料, 或者说是一个分布式系统入门学习大纲: Distributed systems theory for the distributed systems engineer.

对于分布式系统的设计思路文中给出了超级多 理论+实践 的学习资料. 包括一些为新手准备的的电子书, 一些核心概念比如 CAP 理论的解释, 最后还给出了一些值得参考的软件项目. 文章不长, 但是给出的资料非常充实, 看完至少需要两三个月. 大概率后面几周的 Review 都会来自这篇文章给出的资料.

Tip 编程技巧

本周的编程毫无技巧可言.

Share 灵光一闪

真是一点都不灵光的一周.

你可能感兴趣的:(golang,leetcode,动态规划)