Golang白板训练 - 如何巩固所学经验?

Golang白板训练 - 如何巩固所学经验? 我曾深入思考过这个问题:“给定一个每日股票价格切片,你最多可以买入、卖出或持有一股,确定可能的最大利润”。

起初,我把自己搞糊涂了,试图用动态规划来解决,但更优的解决方案是线性的。当我意识到解决方案是线性的时候,我有了一个“顿悟”时刻,并认识到这里有一个值得学习的经验。

我的问题是关于学习策略的:通过解决这个问题,我学到了什么经验可以记录下来,从而整理出一份大型备忘单,作为未来编码和白板挑战的快速复习材料?

这里有没有人曾经针对这类问题做过训练并记过笔记?你能详细说明一下你是如何总结和记住这些经验教训,而不是过后就忘记的吗?

4 回复

更多关于Golang白板训练 - 如何巩固所学经验?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


你好 @skillian

这是该算法的一个变体(无限k)。

我的问题是,一旦我解决了这个问题(这并不难),我应该如何以及记录什么,才能尽可能多地记住它?

  • 记住这个问题的解决方案
  • 记住我当时的思考过程
  • 记住那些“灵光一现”的时刻,以及是什么帮助我达到了这些时刻
  • 利用笔记让我自己快速地为类似问题做好心理准备

你好,@JOhn_Stuart,我有两个问题:

  1. 你指的是这个算法吗?
  2. 你问的是字面上这个具体问题,还是更一般地关于如何记住哪些算法适用于哪些问题?

对于这个问题,你学到的核心经验是:在数组序列中寻找最大差值(卖出价必须大于买入价)时,可以通过一次遍历,动态更新历史最低价并计算当前最大利润

示例代码:

func maxProfit(prices []int) int {
    minPrice := prices[0]
    maxProfit := 0
    
    for i := 1; i < len(prices); i++ {
        if prices[i] < minPrice {
            minPrice = prices[i]
        } else if profit := prices[i] - minPrice; profit > maxProfit {
            maxProfit = profit
        }
    }
    
    return maxProfit
}

关键经验点:

  1. 识别问题模式:这是典型的"最大差值"问题,要求后项减前项的最大值
  2. 优化策略:用O(n)替代O(n²)的暴力解法,避免嵌套循环
  3. 状态维护:只需维护两个变量——历史最低价和当前最大利润
  4. 遍历逻辑:每个价格点只做两件事:更新最低价或计算利润

这类问题的变体包括:

  • 允许多次交易(122题)
  • 含冷冻期(309题)
  • 含手续费(714题)

记录方式建议:按问题分类(数组/字符串/树等),每个类别下记录:

  1. 问题特征
  2. 核心解法模式
  3. 时间复杂度
  4. 典型变体

例如建立这样的笔记结构:

## 数组 - 最大利润类
### 特征:序列中后减前的最大值
### 核心:一次遍历,维护min和maxProfit
### 复杂度:O(n)
### 变体:
- 多次交易:累加所有上升段
- 含冷却期:状态机DP
回到顶部