[心得] Leetcode 刷题解答与 Python 3 小技巧分享

楼主: wheels   2021-07-23 17:28:13
嗨,大家周末愉快!
不知道还记不记得之前小弟有分享面试 Google TW SWE 的心得,
最后有提到小弟当初有发愿,如果顺利进去要把过去写过题目留存的解答整理分享出来,
最近终于施工完了,提供给有需要的人可以自由取用。
这份解答内涵盖了 781 题的 Python 3 解法(太早期刷的题目就没留解法了 QQ),
写这些解答的目的是为了还愿并且回馈给还在努力的板友,
唯一的使用限制就是请不要拿来作商业用途,让知识无偿分享出去,感谢大家。
https://www.notion.so/lenchen/LeetCode-47d625b874894484af7c055b024b9817
内容主要分成四大类,
1. 资料结构
主题涵盖常用于 Leetcode 内解题的资料结构,
较常见的:Array/String, Matrix, Linked List, HashSet/Map, Stack, Queue, Heap
较高阶的:DSU, Trie, BIT
还有偶尔会用到 Deque 跟 sortedcontainers,但数量比较少就没特别分类。
2. 算法
这边其实是我自己的归类,不一定只有这些 XD
内容涵盖有:
greedy, multiple pointers, sliding window, sort, DFS/BFS, backtracking,
sweep line, rolling sum, binary search, dynamic programming, minimax
有趣的是这边没列 divide and conquer 这个经典分类,
因为好像几乎没遇到过哪题是只能使用 divide and conquer 解的,
所以就没有让它自成一个分类了。
但若有题目也可以用 divide and conquer 解的话,
我也有写下来,所以还是可以再自行了解下。
3. 图
图相关的问题因为太经典所以自成一个主题,
整理了我所遇到的常见图论算法,还有 topological sort 的两种方式,
最重要的是 tree 相关的分类也包含在这一部分内。
4. 其他
数学、随机、位元操作相关的题目都会在这里。
大致上就分这四个部分,每个解答底下都有一行字总结这题的解题概念,
因为跨越了两年半所以 coding style 可能也有些不一样,
但保证其中 99% 的内容都是我亲手一个个字符打出来的,
希望能帮助到有需要的人 :)
另外顺便再分享一些我觉得使用 Python 3 刷题时可以用的一些小技巧,
可以让你的 code 变得更精简,大家可以看看然后挑自己喜欢的来使用:
1. 用 next 搭配 generator comprehension 来获取第一个满足条件的元素,
像是 next(ele for ele in arr if ele > 0),就可以拿到 arr 中的第一个正数。
2. 解对称性题目时,可以把引数调换 call 一次,减少重复的 code,像是:
def foo(a, b):
if a > b: return foo(b, a)
...
就可以让你接下来维持在 a <= b 的前提下继续写 code,或者直接 swap 引数也可以:
def foo(a, b):
if a > b: a, b = b, a
...
3. python dict 可以使用 tuple 作 multikey,像是 d[k1, k2, k3],
如此一来就不用巢状 dict 了(d[k1][k2][k3])
4. 可以使用 unpacking 来抽取出需要的参数,像是:
A = [1, 2, 3, 4, 5]
foo, *B, bar = A
可以得到 foo == 1, B == [2, 3, 4], bar == 5
另外还可以用巢状 unpacking,
像是 for i, (a, b) in enumerate(pairs): 就超级常用。
5. Python 3.8 跟 3.9 有多了一些不错的东西,
像是 3.8 的 assignment expression(:=) 跟 3.9 的 dict shallow merge(|)
都有机会可以让 code 更精简。
6. 有些 matrix 或是 grid 的题目,两个 dimension 长度有可能为 0,
可以用 if not any(matrix): return xxx 来处理(感谢 Stefan Pochmann)
7. in 也会消费 iterator,
所以如果想知道某个 str s2 是不是另一个 str s1 的 subsequence 可以这么做,
I = iter(s1)
return all(c in I for c in s2)
(再次感谢 Stefan Pochmann)
8. 想要测两个数是不是同正负可以用 (a > 0) is (b > 0),记得事先检查 0
板友提供 (credit to @pig2014): a ^ b > 0 更好
9. 想要摊平巢状 list 可以用 sum(L, []) <- 不建议!途中 list 会一直重新 alloc
(credit to @coquelicot)
参考 stack overflow:https://bit.ly/3rz8UqH
建议的替代:
9.1. list comprehension: A = [ele for sub in arr for ele in sub]
9.2. itertools: A = list(itertools.chain.from_iterable(arr))
9.3. reduce: A = functools.reduce(operator.iconcat, arr, [])
10. 某些要提供 factory function 的地方,可以递回给自己,像是:
trie = lambda: collections.defaultdict(trie)
11. itemgetter 在某些需要 key 的 builtin function 很好用,像是:
sorted(A, key=itemgetter(1)),等同于写 key=lambda x: x[1]
12. 因为 Python list 提供 negative indexing,
在某些情况可以用 ~i 来获得对应于 i 的反向 indexing,像是:
for i in range(len(A)):
A[i] += xxx # A[0], A[1], A[2] , ...
A[~i] += ooo # A[-1], A[-2], A[-3], ...
大概就是这些东西了吧,这些技巧有些人喜欢有些人不喜欢,
我觉得没有对错啦,就挑自己觉得不错的用吧 XD
happy coding!
作者: yupog2003 (屁股)   2021-07-23 17:37:00
还没看内容,先大推,感谢
作者: EngineerChen (安吉尼尔)   2021-07-23 17:38:00
推神人
作者: Csir (张胖胖)   2021-07-23 17:44:00
神QQ
作者: kiki86151 (鲁饭)   2021-07-23 17:51:00
推 python很多技巧真的很好用
作者: mathbookh2o2   2021-07-23 17:54:00
感觉实用
作者: Lyumin (玉米)   2021-07-23 17:58:00
推爆
作者: hanamini (迷你花)   2021-07-23 18:07:00
作者: jamfly (jamfly)   2021-07-23 18:11:00
大推
作者: KingSteven (HHung)   2021-07-23 18:14:00
作者: longint (数整的长长)   2021-07-23 18:18:00
作者: kyrie77 (NTU KI)   2021-07-23 18:23:00
作者: cossetannie (paa)   2021-07-23 18:29:00
作者: sph113 (sph)   2021-07-23 18:51:00
作者: parsons12342 (拜妈祖有保庇)   2021-07-23 18:53:00
推好心
作者: k798976869 (kk)   2021-07-23 18:57:00
作者: chatnoir (对不起)   2021-07-23 18:57:00
大推
作者: UnReal5566 (匪莪伊蒿)   2021-07-23 19:07:00
有神
作者: eggy1018 (羅密歐與豬過夜)   2021-07-23 19:10:00
真的是有刷的很深的才知道的python3小技巧! 推一本effective python 90 method
作者: CKNTUErnie (德田田馥甄)   2021-07-23 19:13:00
作者: Findagreen (天母克鲁蛇)   2021-07-23 19:25:00
太佛了 在这边祝福原po上厕所都有卫生纸
作者: luweber88 (猫咪)   2021-07-23 19:27:00
作者: oopssugar (ratio)   2021-07-23 19:33:00
推推
作者: duck10704 (duck)   2021-07-23 19:35:00
推 神人
作者: TAMSHUI (讓我醉死在夢裡~)   2021-07-23 19:36:00
推!
作者: ZuiYang (Zui)   2021-07-23 19:41:00
作者: HMW (捷安特)   2021-07-23 19:56:00
push
作者: gaowei16 (啾啾人)   2021-07-23 19:57:00
作者: Kagami3421 (卡加米)   2021-07-23 19:58:00
作者: alpe (薛丁格的猫)   2021-07-23 19:59:00
大推
作者: phys (jl)   2021-07-23 20:00:00
作者: WaterLengend (Leeeeeeeeooooooo)   2021-07-23 20:01:00
只能推了
作者: rumrumrum (台大周杰伦)   2021-07-23 20:03:00
推推
作者: kangan987 (Jon.Snow)   2021-07-23 20:14:00
太强了!推
作者: unmolk (UJ)   2021-07-23 20:14:00
推….
作者: ttsung2 (宗宗)   2021-07-23 20:20:00
作者: underwater (underwater)   2021-07-23 20:30:00
虽然不是用python,还是大推
作者: littleshin (littleshin)   2021-07-23 20:34:00
作者: onthesea (i am telegrammed)   2021-07-23 20:45:00
太神了
作者: knme (knem)   2021-07-23 20:48:00
作者: bowin (尽其在我)   2021-07-23 20:49:00
推分享
作者: itis0423 (co)   2021-07-23 20:53:00
作者: lingege32 (MUDA)   2021-07-23 20:57:00
推大神
作者: jinmin88 (昼伏夜出)   2021-07-23 20:58:00
太猛啦
作者: llltt123 (aka yoko)   2021-07-23 20:59:00
推 感谢大神
作者: OSDBNetwork (路人甲)   2021-07-23 21:02:00
推 大神
作者: leewei05 (抠抠)   2021-07-23 21:02:00
作者: ericx790101   2021-07-23 21:12:00
推!感谢无私分享!
作者: tnfshjcc (↖煞气a携阿携↘)   2021-07-23 21:14:00
推推 实用Python技巧
作者: EntHeEnd (ㄆㄆ)   2021-07-23 21:41:00
赞喔
作者: caeserhaha (凯萨沙拉)   2021-07-23 21:49:00
推爆
作者: nicehorse06 (嘿嘿马)   2021-07-23 21:56:00
大神推
作者: tw11509 (John-117)   2021-07-23 22:02:00
推,太神啦
作者: aassdd926 (打东东)   2021-07-23 22:10:00
看完觉得我不会写Python…
作者: DCTmaybe (竹竹人)   2021-07-23 22:17:00
也太神了吧
作者: devilkool (对猫毛过敏的猫控)   2021-07-23 22:53:00
厉害
作者: bjocke831010 (bjocke)   2021-07-23 23:34:00
感谢大神~
作者: Luke3723 (Banana)   2021-07-23 23:39:00
太神了 推!!
作者: yesgowow (荷包蛋)   2021-07-23 23:47:00
推 谢谢分享
作者: tommytyc (75303301)   2021-07-24 00:16:00
作者: birdman (阿丸)   2021-07-24 01:03:00
推分享
作者: ss8651twtw (linsc04)   2021-07-24 01:29:00
学到了好多技巧 推推
作者: juju123 (华尔骑莉亚)   2021-07-24 01:32:00
推推
作者: yoshonabee (我右手拿笔如神一般)   2021-07-24 01:35:00
作者: cacadeon (deon)   2021-07-24 01:37:00
感谢详细分享
作者: f8210440 (Bl_20111022)   2021-07-24 01:57:00
感谢 分享
作者: charle0911   2021-07-24 02:01:00
娘子出来看善心的耶稣
作者: vincent0965   2021-07-24 02:02:00
作者: s1020824 (HowardW)   2021-07-24 02:26:00
作者: cococing (大肥)   2021-07-24 02:59:00
推推
作者: la197352   2021-07-24 03:02:00
谢谢分享
作者: mirror0227 (镜子)   2021-07-24 03:17:00
有些技巧让可读性降低了 宁愿不用Code写得快没错 但好读重要很多吧
作者: dog661121 (完美不完美)   2021-07-24 03:31:00
推爆
作者: jack529 (Jack)   2021-07-24 03:51:00
作者: arunaway (哎哟)   2021-07-24 04:36:00
谢谢分享
作者: hydradevil (丞)   2021-07-24 06:24:00
推佛心
作者: davidpanda (panda)   2021-07-24 07:12:00
下面的小技巧要慎用, 主要是你需要解释给面试官听不是写得快就好leetcode的题目其实讨论区都有很好的答案想不出来的时候其实不妨看看讨论区最后就是要融会贯通, 如果自己当过面试官就知道其实很容易可以看出来面试者是真的懂还是背答案
作者: papaya0807 (papaya)   2021-07-24 08:55:00
推好神
作者: kiillen (神龙)   2021-07-24 09:27:00
太佛拉
作者: j6004j6 (顺仔)   2021-07-24 09:34:00
推起来~ 太佛了
作者: mike8469 (mike8469)   2021-07-24 09:35:00
作者: jimjim951357 (v54dt)   2021-07-24 09:36:00
作者: HelloPTT   2021-07-24 10:03:00
作者: julian9925 (可怜的大学生)   2021-07-24 11:05:00
好佛,谢谢大大分享
作者: Rayishere (Rayishere)   2021-07-24 11:05:00
大推~~~ 感谢大大的无私分享
作者: swinds24 (阿肾)   2021-07-24 11:50:00
推分享!
作者: elseif   2021-07-24 12:12:00
感谢分享! 来拜读!
作者: FireKingStar (小庄)   2021-07-24 12:18:00
谢谢大大的分享,我会仔细的研读它。
作者: loveu8 (RA1-推广)   2021-07-24 12:25:00
推分享~
作者: angellee0102 (我掉进了五月天坑^^)   2021-07-24 12:41:00
感谢分享!
作者: sarsman (DeNT15T♠)   2021-07-24 12:55:00
作者: windmax1 (I do my best)   2021-07-24 13:52:00
天啊 大神太伟大了
作者: tinwen (卡加ㄅㄨ列岛)   2021-07-24 15:10:00
推~
作者: ID3238 (默默)   2021-07-24 15:14:00
谢谢分享 这对求职面试帮助很大
作者: stu51211 (做就对了)   2021-07-24 15:19:00
谢谢!
作者: Raymond0710 (雷门)   2021-07-24 15:26:00
感谢无私分享
作者: hortune (enutroh)   2021-07-24 15:33:00
推!
作者: nba887215 (方块马)   2021-07-24 15:40:00
作者: AgileSeptor (S.Duncan_JB)   2021-07-24 15:54:00
作者: snowm   2021-07-24 15:55:00
谢谢分享!
作者: euleramon (钱换不了的东西)   2021-07-24 16:37:00
想请问一下大大是不是有做过 AI相关的领域?
作者: deforest111 (deforest)   2021-07-24 16:47:00
推强者
作者: Gaogaigar   2021-07-24 17:02:00
推佛心 可惜我躺平了才看到
作者: blackdiz   2021-07-24 17:18:00
感谢分享,好人一生平安
作者: cuh0309 (yo玮)   2021-07-24 17:41:00
作者: andy9595995 (李律)   2021-07-24 18:13:00
作者: vvind (wind)   2021-07-24 18:57:00
太棒了
作者: freedls (阿嬤覺得你冷)   2021-07-24 19:11:00
这个必推
作者: sky80420 (泽西哥)   2021-07-24 19:40:00
推推
作者: jasonwung (路人JJ)   2021-07-24 19:45:00
推推
作者: playboy007gy (金牌)   2021-07-24 19:56:00
好人一生平安
作者: tigerya (虎Ya)   2021-07-24 21:25:00
推!
作者: qq9966pp (神鸡大人)   2021-07-24 22:15:00
必须推
作者: nofeel0 (\Bjergsen最高/)   2021-07-24 22:30:00
推,感恩大大
作者: cotbel   2021-07-24 22:59:00
是notion,整理得好干净! 推推
作者: DLHZ ( )   2021-07-24 23:13:00
作者: hongwl030 (迷途小黑羊)   2021-07-24 23:24:00
推 有实力又好心
作者: kevinfilter (justinyeh1995)   2021-07-24 23:47:00
大推 感谢分享
作者: a24626296 (DD)   2021-07-24 23:50:00
感恩,赞叹
作者: shieldsky (Gray wolf)   2021-07-25 00:14:00
真的好厉害!感谢分享!技巧很实用!
作者: ob9618 (ob9618)   2021-07-25 00:23:00
作者: f821027 (蛋饼)   2021-07-25 01:01:00
作者: KindWei (一切都是梦)   2021-07-25 01:14:00
推 python技巧
作者: amiwry (肥墩墩大人)   2021-07-25 03:20:00
感谢分享
作者: PonyTail0901 (马尾控)   2021-07-25 04:05:00
太强大了 希望我也能早日上岸
作者: bcjohn (bc)   2021-07-25 08:46:00
作者: apple20132 (噜噜)   2021-07-25 09:37:00
推 感谢
作者: summerleaves (内湖全联先生)   2021-07-25 09:38:00
推推
作者: somoo (MMM)   2021-07-25 09:50:00
推神人 感谢无私分享
作者: cypress5048 (brian)   2021-07-25 10:56:00
大推!!
作者: blueVC (Uncle Carter)   2021-07-25 11:07:00
感谢分享!
作者: darkch (chang)   2021-07-25 11:14:00
这一定要推
作者: kuochuwon (黑轮桑~ YO)   2021-07-25 11:51:00
收藏一下,推
作者: lofu (lofu)   2021-07-25 14:51:00
作者: gn02335338 (HI)   2021-07-25 15:52:00
作者: followmeyo (简简单单)   2021-07-25 16:48:00
高手
作者: rotalume (rotalume)   2021-07-25 17:12:00
推!
作者: ukuk666888 (逆战)   2021-07-25 17:43:00
作者: JocMon (晴朗夜晚)   2021-07-25 18:48:00
推!
作者: world4jason (凉风男孩)   2021-07-25 19:49:00
9的话分享个小东西 在整理资料的时候常常用到的主要是好几种摊平的方法 其实速度上会有差异之前因为有需求有写过一些比较reduce跟map印象中到了一定的scale后速度颇慢 所以直接弃用 numpy的话如果能指定型别 速度会快上更多不过如果都是python的list的话 就要看了 通常会慢都是混用的锅像是有时候知道pure python跑比较快的写法 但拿回来的是巢状numpy array 光转成list成本就很大了py真坑XD
作者: answermangtr (你今天抓了嘛)   2021-07-25 20:26:00
超级巧 刚刚看完您的面试心得就发现您发新文章
作者: Ekmund (是一只小叔)   2021-07-25 20:36:00
用心分享给推
作者: snow10725 (今天天气不错)   2021-07-25 20:41:00
围观感谢
作者: xoy232 (鬼岛希特勒)   2021-07-25 21:44:00
推大神
作者: elvis17   2021-07-25 22:41:00
推 感谢大神分享~
作者: Ouranos (å—¨)   2021-07-25 22:49:00
大推,谢谢分享!
作者: smily134 (father134)   2021-07-25 23:01:00
作者: tsubasaxxx   2021-07-25 23:19:00
收藏推 谢谢
作者: koichip (黑桃)   2021-07-26 00:06:00
推,谢谢大神分享
作者: hongyan (Yan)   2021-07-26 00:09:00
推 谢谢大什!!!神
作者: dannymc   2021-07-26 00:28:00
推推,感谢分享
作者: whatabiggun (奶奶早安)   2021-07-26 00:31:00
感谢
作者: airforceso (M)   2021-07-26 02:54:00
感恩推推推
作者: ufap   2021-07-26 04:03:00
谢谢
作者: stone0811 (Stone)   2021-07-26 07:47:00
先推
作者: whitecolor (白色)   2021-07-26 09:27:00
作者: BlazarArc (Midnight Sun)   2021-07-26 12:22:00
推推
作者: aacs0130 (湛靈)   2021-07-26 13:52:00
推推,实用,不过某些特殊的语法要确定自己了解再用
作者: maoqq0405   2021-07-26 15:06:00
推推
作者: sandy4645 (Violet)   2021-07-26 16:09:00
推 太佛 谢谢分享
作者: TRESS   2021-07-26 22:59:00
作者: howard50009 (zxc50009)   2021-07-26 23:40:00
推推推推
作者: timuwtpirt (提姆化工学渣)   2021-07-28 00:18:00
作者: WWIII (东邪西毒)   2021-07-28 16:02:00
感动啊 软件人都是无私奉献
作者: holmes2136 (holmes)   2021-07-28 19:01:00
推分享
作者: sars78786 (Nick)   2021-07-29 23:39:00
作者: NealPope (尼尔教皇)   2021-07-30 00:40:00
推爆啦!
作者: justboa   2021-07-30 12:22:00
谢谢分享!
作者: hsiaotzu0505 (走啦走啦)   2021-08-01 11:14:00
推!谢谢!
作者: tinnnnnngg (jjking)   2021-08-03 02:57:00
推实用
作者: gvles1210   2021-08-03 16:13:00
作者: YNNEKUW (YNNEKUW)   2021-08-03 19:10:00
大推
作者: salamii (saaa)   2021-08-03 23:06:00
作者: markbex (马克杯)   2021-08-04 22:43:00
推!感谢分享
作者: UlyssesLee (Ulysses)   2021-08-05 23:08:00
好久没来这版 一来就看到神 推推
作者: hiarpu (up)   2021-08-07 18:18:00
作者: FourZero (亲爱的路人)   2021-08-15 00:07:00
有神快拜

Links booklink

Contact Us: admin [ a t ] ucptt.com