Golang白板训练 - 如何巩固所学经验?
Golang白板训练 - 如何巩固所学经验? 我曾深入思考过这个问题:“给定一个每日股票价格切片,你最多可以买入、卖出或持有一股,确定可能的最大利润”。
起初,我把自己搞糊涂了,试图用动态规划来解决,但更优的解决方案是线性的。当我意识到解决方案是线性的时候,我有了一个“顿悟”时刻,并认识到这里有一个值得学习的经验。
我的问题是关于学习策略的:通过解决这个问题,我学到了什么经验可以记录下来,从而整理出一份大型备忘单,作为未来编码和白板挑战的快速复习材料?
这里有没有人曾经针对这类问题做过训练并记过笔记?你能详细说明一下你是如何总结和记住这些经验教训,而不是过后就忘记的吗?
4 回复
更多关于Golang白板训练 - 如何巩固所学经验?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
你好 @skillian,
这是该算法的一个变体(无限k)。
我的问题是,一旦我解决了这个问题(这并不难),我应该如何以及记录什么,才能尽可能多地记住它?
- 记住这个问题的解决方案
- 记住我当时的思考过程
- 记住那些“灵光一现”的时刻,以及是什么帮助我达到了这些时刻
- 利用笔记让我自己快速地为类似问题做好心理准备
你好,@JOhn_Stuart,我有两个问题:
- 你指的是这个算法吗?
- 你问的是字面上这个具体问题,还是更一般地关于如何记住哪些算法适用于哪些问题?
对于这个问题,你学到的核心经验是:在数组序列中寻找最大差值(卖出价必须大于买入价)时,可以通过一次遍历,动态更新历史最低价并计算当前最大利润。
示例代码:
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
}
关键经验点:
- 识别问题模式:这是典型的"最大差值"问题,要求后项减前项的最大值
- 优化策略:用O(n)替代O(n²)的暴力解法,避免嵌套循环
- 状态维护:只需维护两个变量——历史最低价和当前最大利润
- 遍历逻辑:每个价格点只做两件事:更新最低价或计算利润
这类问题的变体包括:
- 允许多次交易(122题)
- 含冷冻期(309题)
- 含手续费(714题)
记录方式建议:按问题分类(数组/字符串/树等),每个类别下记录:
- 问题特征
- 核心解法模式
- 时间复杂度
- 典型变体
例如建立这样的笔记结构:
## 数组 - 最大利润类
### 特征:序列中后减前的最大值
### 核心:一次遍历,维护min和maxProfit
### 复杂度:O(n)
### 变体:
- 多次交易:累加所有上升段
- 含冷却期:状态机DP

