ARTS 是由左耳朵耗子陈皓在极客时间专栏《左耳听风》中发起的一个每周学习打卡计划。
Algorithm:至少做一个 LeetCode 的算法题。主要为了编程训练和学习。
Review :阅读并点评至少一篇英文技术文章。主要为了学习英文,如果你英文不行,很难成为技术高手。
Tip:学习至少一个技术技巧。主要是为了总结和归纳你日常工作中所遇到的知识点。
Share:分享一篇有观点和思考的技术文章。主要为了输出你的影响力,能够输出你的价值观。
Algorithm
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2], [3,4], [6,5,7], [4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/triangle
//自顶向下记忆化搜索 func minimumTotal(triangle [][]int) int { storeMem := make(map[string]int) return findMax(triangle, 0, 0, storeMem) } func findMax(triangle [][]int, level int, index int, storeMem map[string]int) int { key := strconv.Itoa(level) + "-" + strconv.Itoa(index) if value, ok := storeMem[key]; ok { return value } if level == len(triangle)-1 { storeMem[key] = triangle[level][index] return triangle[level][index] } left := findMax(triangle, level+1, index, storeMem) right := findMax(triangle, level+1, index+1, storeMem) if left < right { storeMem[key] = left + triangle[level][index] return left + triangle[level][index] } else { storeMem[key] = right + triangle[level][index] return right + triangle[level][index] } } //DP方程 // dp[i][j] = min(dp[i+1][j],dp[i+1][j+1])+dp[i][j] func minimumTotal(triangle [][]int) int { //初始化状态数组 dp := triangle for i := len(triangle) - 2; i >= 0; i-- { for j := 0; j < len(triangle[i]); j++ { if dp[i+1][j] < dp[i+1][j+1] { dp[i][j] += dp[i+1][j] } else { dp[i][j] += dp[i+1][j+1] } } } return dp[0][0] }
Tip
面试技巧:审题能力,挖掘已知条件,确定边界
需求不明确,范围不清晰的问题,很难得到合理的设计。
比如设计秒杀,那么预估它的 qps 是多少,不同量级的产品,设计出来的架构复杂程度会有很大不同。
另外就是为了考察候选人的产品分析能力,需要在提问的问题的基础之上进一步明确需求,确定边界。(产品往往不会把所有需求说清楚)。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于