ARTS 是陳浩(網名左耳朵耗子)在極客時間專欄裏發起的一個活動,目的是經過分享的方式來堅持學習。算法
每週寫一個 ARTS:Algorithm 是一道算法題,Review 是讀一篇英文文章,Technique/Tips 是分享一個小技術,Share 是分享一個觀點。
這周的算法題是 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 }
本週的文章是一份分佈式系統學習的經典資料, 或者說是一個分佈式系統入門學習大綱: Distributed systems theory for the distributed systems engineer.post
對於分佈式系統的設計思路文中給出了超級多 理論+實踐 的學習資料. 包括一些爲新手準備的的電子書, 一些核心概念好比 CAP 理論的解釋, 最後還給出了一些值得參考的軟件項目. 文章不長, 可是給出的資料很是充實, 看完至少須要兩三個月. 大機率後面幾周的 Review 都會來自這篇文章給出的資料.學習
本週的編程毫無技巧可言.設計
真是一點都不靈光的一週.code