上周末一时兴起做了半个小时的视频号直播,没有准备,没有主题,就是跟大家随性的聊了一会,整体感觉比做自己去视频要轻松很多。
今晚9:30再来一次视频号直播,这次我稍作了一下准备,主题是“读书&写作”,到时欢迎大家来捧场。另外也准备了小礼物,就是下面要介绍的这本算法小抄,这个教程在GiHub将近70k的关注。
这次一共送10本,中奖率很多比在公众号高很多,毕竟视频号直播不会比看公众号的人多。
作者是付东来,是微信公众号labuladong的作者,江湖人称Offer收割机,有着多年的刷题经验书有一点和其他的书不太一样,书中并没有统一编程语言,而是混用了三种最常用的编程语言:Python、C++ 和 Java。
这么做主要是考虑到刷算法题是在养成一种思维模式,不应该局限于具体的编程语言。每一种语言都有缺点,我们到底选择用哪一种语言来解某道题目的根本依据是,解法的思路是否可以避开隐晦的语言特性,做到清晰易懂。
不用担心有的语言你不熟悉,算法根本用不到编程语言层面的技巧,本书会秉持最小化语言特性的原则,只会介绍本书中用到的数据结构和对应的 API,只要你学过任何一门编程语言,很容易就能明白。
例如在“动态规划解题套路框架”章节中,会讲到凑零钱问题,暴力解法就是遍历一棵 N 叉树: 1def coinChange(coins: List[int], amount: int):
2
3 def dp(n):
4 if n == 0: return 0
5 if n 0: return -1
6
7 res = float('INF')
8 for coin in coins:
9 subproblem = dp(n - coin)
10 # 子问题无解,跳过
11 if subproblem == -1: continue
12 res = min(res, 1 + subproblem)
13 return res if res != float('INF') else -1
14
15 return dp(amount)
这么多代码看不懂怎么办?直接提取框架,这样就能看出核心思路了1def dp(n):
2 for coin in coins:
3 dp(n - coin)