活跃农民
- 积分
- 343
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2019-6-7
- 最后登录
- 1970-1-1
|
2020年6月17日,第十六天发帖,今天刷了7道题:
403. Frog Jump。这是一个DP,state定义为某一个石块所在的位置可以从前面哪些石块的位置跳过来,最后检查最后一个石块是不是对应着一个空集。虽然标记为hard,但是个人认为在DP里不算是很难的。注意这个题目比较特殊的worst case时间复杂度是O(N sqrt(N))。
399. Evaluate Division。这道题乍一看是数学问题,还想着通过强行给各个变量赋值来做,不过后来发现这样操作在引发冲突的时候不好自我纠正。所以它本质上有点像加权的图的问题,而且互相连通的几个节点里两两之间都是可以有一条边的,而且这条边的权重取决于其它边的权重。于是把图抽象为一个map:{节点 -> {节点 -> 权重}},由input建好图,然后用dfs来寻找每个query的path,同时也计算着不存在的边的权重值,这就提供了memory。只是一开始的时候去重没做好,没有使用visited数组导致了死循环。然后用了visited数组又会发现由于从不同的起始节点开始计算的时候,可能会出现某两个节点之间的连通性由连通错误地判定为不连通,结果还被保存上了。前前后后花了一个多小时才AC。
642. Design Search Autocomplete System。用了字典树和最小堆,为了方便理解和封装还用OOD写的。题目本身并不复杂,只是OOD需要写的代码太多了,还遇到了很多小bug,最后花了快2个小时才AC。
496. Next Greater Element I。这是我在LC上见过的表述得最差劲的问题了。本质上是问一个元素在一个array之后的next greater element,并用不同的input重复多次。如果直接brute force就是O(N^2),但是在使用了map和栈之后可以简化一部分问题,使复杂度落在O(N)和O(N^2)之间。
320. Generalized Abbreviation。这个题由于每一个字符可以相互独立地简化或者不简化,让我瞬间联想到boolean数组,同时可以用binary integer来表示。于是从0循环到2^N - 1,每一位字符由其对应位置上的bit来决定是否简化。然后把相邻的简化的字符用数字代替。
8. String to Integer (atoi)。这个题感觉就是在考人寻找edge case的能力。遂写完代码之后自己写了一些edge case:超级大的数,超级小的数,数字前面有俩正负号,数字后面紧跟着各种符号,等等。
388. Longest Absolute File Path。我的做法是先把每个namespace和每个\n及\t分割开,通过stack来跟踪当前的namespace,如果遇到了文件就更新一个maxlength变量。
总结一下:
0. 今天又复习了一下进阶级的正则表达式。
1. 由除法题想到的:对多个元素之间的相对关系建模,首先考虑无向图。而无向图可以用双向的有向图来模拟。
2. 由trie题想到的:面试时和面试官做好沟通,商量清楚如果代码量太复杂用正常速度写不完,是要牺牲代码质量还是牺牲速度。
3. 单调栈增减元素元则可以有很多:比如单调递减栈,直接忽略更大的元素可以找到数值上next greater element,而一有大元素就一直pop栈顶可以找到位置上next greater element。顺便提一句:最小堆则只能找到数值上next greater element。
|
|