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.post

對於分佈式系統的設計思路文中給出了超級多 理論+實踐 的學習資料. 包括一些爲新手準備的的電子書, 一些核心概念好比 CAP 理論的解釋, 最後還給出了一些值得參考的軟件項目. 文章不長, 可是給出的資料很是充實, 看完至少須要兩三個月. 大機率後面幾周的 Review 都會來自這篇文章給出的資料.學習

Tip 編程技巧

本週的編程毫無技巧可言.設計

Share 靈光一閃

真是一點都不靈光的一週.code

相關文章
相關標籤/搜索