ARTS - 21 LeetCode 322 零钱兑换 | 分布式系统经典学习资料
Posted 澎湃哥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 灵光一闪
真是一点都不灵光的一周.
以上是关于ARTS - 21 LeetCode 322 零钱兑换 | 分布式系统经典学习资料的主要内容,如果未能解决你的问题,请参考以下文章