Encode and Decode Strings 要点:题的特点:不是压缩,而是encode为字节流.所以需要找delimiter来分割每个word,但是delimiter可能是字符本身,所以可以用数字记录每个word的长度.这样一般比delimiter简单并且节省空间.接着可能会想到如果前后单词有数字怎么办?所以需要一个特殊字符来分割数字和词本身,而这个字符要在数字之后:不用担心前面单词以数字结尾,前一个单词通过长度信息已经成功decode. ''.join('%d:' % len(s)+s…
Word Break I/II 现在看都是小case题了,一遍过了.注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm) (取决于inner loop是i还是m).所有解的个数是exponential的 (比如"aaaa....", dict="a, aa",每层都有2个选择).以前在amazon onsite遇到过,不过既不是返回True/False,也不是所有解,而是一个解.其实一个解和True/Fals…
Paint House I/II 要点:这题要区分房子编号i和颜色编号k:目标是某个颜色,所以min的list是上一个房子编号中所有其他颜色+当前颜色的cost https://repl.it/Chwe/1 (I) 善用slicing来eliminate list中一点,还有一点好处是不用考虑超越边界了 II:如何从O(nkk)降到O(n*k)? 每次找到上一个房子编号list的的min这个循环如果在每个k都做一遍,肯定是redundant的.其实loop一遍就能找到对所有颜色k需要的min:m…
Graph Valid Tree 要点:本身题不难,关键是这题涉及几道关联题目,要清楚之间的差别和关联才能解类似题:isTree就比isCycle多了检查连通性,所以这一系列题从结构上分以下三部分 given a graph or edges?有可能给点的编号,然后只给edges,这个最适合用union-find.如果用dfs,那么要先转化成adjacent list表示.这样如果直接给的连通关系的graph,那么dfs就比较直接了 isCycle:directed or undirected:…
Zigzag Iterator 要点: 实际不是zigzag而是纵向访问 这题可以扩展到k个list,也可以扩展到只给iterator而不给list.结构上没什么区别,iterator的hasNext和计数殊途同归. 一种方法利用queue,进queue的顺序就是下一个要访问的元素index和v,实际就是level order traversal 另一种是用一个list存每个v的当前位置(or iterator).然后track count:当前列访问完了(即list访问一遍),reset co…
dp/recursion的方式和是不是game无关,和game本身的规则有关:flip game不累加值,只需要一个boolean就可以.coin in a line II是从一个方向上选取,所以1d dp,而coin in a line III是两个方向,所以是2d dp flip game II: . https://repl.it/CeES https://repl.it/CeES/1 (find version) 错误点: minmax game中递归的优化条件是相反的,这题应该是对手F…
(今日完成:Two Sum, Add Two Numbers, Longest Substring Without Repeating Characters, Median of Two Sorted Arrays, Longest Palindromic Substring) 恼人的median of two sorted arrays 前几年google的必考题,现在考的比较少了,思路就是binary search,具体来说, 如果是一个array,因为是sorted,找到第k个元素是tri…
Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phone Directory which supports the following operations: # get: Provide a number which is not assigned to anyone. # check: Check if a number is available…
Two Sum I/II/III 要点:都是简单题,III就要注意如果value-num==num的情况,所以要count,并且count>1 https://repl.it/CrZG 错误点: TLE:defaultdict is slower than normal dict TLE:.keys() copies keys, it's way slower # Design and implement a TwoSum class. It should support the followi…
One Edit Distance 要点:有两种解法要考虑:已知长度和未知长度(比如只给个iterator) 已知长度:最好不要用if/else在最外面分情况,而是loop在外,用err记录mismatch个数,err:0,err:1,有一位mismatch,这时候再if/else分replace or ins,err:2:return False https://repl.it/CquW 错误点:index回移的logic:短的回移,因为每步必向前,所以相当于短的不动,长的动 未知长度:因为两…
Longest Substring with At Most K Distinct Characters 要点:要搞清楚At Most Two Distinct和Longest Substring Without Repeating Characters (No Repeating)的区别:前者的sliding window里只有2个char,但是可以任意重复.而后者可以有任意多个char但是任何char都不能有重复. 所以解法上前者的hashset只有2个元素,而后者需要把所有distinct…
Missing Range 要点:题简单,这类题的特点都是记录上一步的状态,比如这题是end 错误点: 三种情况:一是连续的,即和上一个end差1,而是中间只差1个数,没有'->',最后是大于1,有'->' 看清题:upper/lower是boundary,不一定出现在nums里.为了统一,把upper+1放入nums,同时初始end=lower-1 区间是[end+1, num-1] 别忘了每次更新end https://repl.it/Cjvy/2 # Given a sorted int…
Read N Characters Given Read4 I/II 要点:这题的要点就是搞清楚几个变量的内在逻辑:只有buffer是整4 bytes的.而client要读的bytes(需求)和实际上disk上有的bytes(供给)都是不整的.所以, 循环的条件就是either 供给不足 or 需求不足:供给不足的判定是上一轮数据不够4 bytes的mark,而需求不足是toRead的计数<=0 所以循环体内,就是min(读进来的bytes, toRead)来把数据copy到buffer里,同时…
Strobogrammatic Number I/II/III 要点:记题,注意轴对称和点对称的区别.这题就是几个固定digit之间的palindrome I https://repl.it/CqLu II https://repl.it/CivO (java) https://repl.it/CqKC (python) 外循环中止条件:2个或3个字符都是循环一次,每层n-2,所以是n>1 00不考虑的情况是n>3,因为是从内向外循环,2或者3是最外一层 python: string可以unp…
Shortest Word Distance I/II/III 要点:系列题最重要的是记清题,重点是题目本身的变化和解法之间的关联. I https://repl.it/CqPf 这题的一般规律从左到右的某个word提供了boundary为之后的word做比较用:所以遇到两个word中的一个,一是和另一个word比较,二是更新本word的boundary. 和Closest Binary Search Tree Value很像,都是boundary限定 III https://repl.it/C…
Count Univalue Subtrees 要点:检测条件比较有意思:因为可能的情况比较多,只要违反了任意一条就return False,所以可以只考虑False的情况,最后return True. https://repl.it/CoqQ 错误点:这题类似Largest BST Subtree(with all descendants,bottom up方法,or post order),左子树不符合只能invalidate root,但仍然要recurse到右子树,所以不能提前返回,而是…
3Sum Smaller 要点:类似的题还有lintcode的triangle count:https://github.com/delbao/onlineJudge/blob/master/lintcode/109.triangle-count.java i,j,k的规律:i:最外层,每走一步,j要重新来过,j第二层,起始为i+1,k初始取决于题目.主要利用了: [j,k]之间的增序:当k满足条件后,顺序之后的也都满足条件,这时候就可以继续移动j了. 移动j的时候,由于j位置的元素变大了,k在…
Closest Binary Search Tree Value II 要点:通过iterator,把closest值附近的k个closest找到,从而time降为O(klgn) in order iterator的本质:栈存当前见到,未来还要再访问到的node.当前见到是沿着left访问,而未来再见到就是到了right branch 这题的iterator实现和一般的in-order iterator略有不同:inorder访问后的结点并不出栈而是直接继续push right subtree,…
Find the Duplicate Number 要点:通过Pigeonhole principle对值空间做binary search,具体来说, low,mid,high都是值空间,所以范围是[1,n].注意鸽巢原理是positive:也就是多出来的必有重复.所以如果[1,mid]之间的元素cnt>mid,那么duplicate在[1,mid]内. 那么negative成立吗?也就是说cnt<=mid,[1,mid]就没有duplicate吗?首先鸽巢原理对negative是不适用的,但…
Meeting Rooms I/II 要点:这题和skyline类似,利用了interval start有序的特点,从左向右处理,用一个heap来动态表示当前占用rooms的时间段,所以heap的size就是room数.具体来说, heap是end time的min heap 当前?就是和新interval同时使用room的情况 如果min end<=新的interval.start,那么同一房间可以被这个interval重用.同时所有heap中end小的都要pop 如果min end>新的i…
要点:这题是combination的应用,从左向右想比从右向左容易. 因为有结果从小到大的要求,暗示用combintion而不是permutation 其实就是从小到大验证因子,每个因子和其对称因子立即成为一个res到solutions里 因子的范围是i*i<=n,因为对称的部分已经在验证当前因子的时候push到solutions里了 每层的循环内从当前因子开始验证,每层要分解的数是上一层分解后剩下的 错误点: confusion:每一个因子都有可能,所以是combination 与combin…
Flatten 2D Vector 要点: 这题是2d的iterator,一般对于1d的情况,hasNext()是不需要做移动的.而2d不同,core iterator是j向的,而i向要在hasNext()中移动以保证call next()的时候j是available的. hasNext()如何移动?首先的思路是not j.hasNext()是触发i移动的条件,同时j本身也可能是None(比如Null 2d list).简单的说就是不算移动i直到j没超界,如果i都超界了,那么return Fal…
Walls and Gates 要点: 同样是bfs,这题可以用渲染的方法(即全部gate进初始q),注意区别Shortest Distance from All Buildings.那道题要找到某个点到"all" buildings的距离,所以不能用渲染,因为不是到该点的一条路径.而本题类似surrounded region,最终的最佳路径只取一条路径 bfs的方法全是在展开后入q前更新 剪枝:只要值更新了,就一定是最小值.不用入q了 错误点: 忘了更新距离.因为gate是0,所以距…
Paint Fence 要点: 这题是求number of ways,如果是相邻不相同颜色,那么就trivial了:k*(k-1)^(n-1).所以这里no more than two adjacent fence posts就是不能连续出现3个相同颜色的. 注意这题的解序列都是连续的,所以dp表示的就是以当前fence结束的情况. 这题要用两个dp variables:same:表示最近两个posts是相同颜色,diff:表示最近两个posts是不同color.why?首先这两种情况是excl…
Inorder Successor in BST 要点:这题要注意的是如果不是BST,没法从树结构上从root向那边找p,只能遍历.而根据BST,可以只走正确方向 如果不检查right子树,可以从root到下,但invariant是root!=null.而检查右子树,invariant可以是root!=p 错误点: 不是找到某个>p.val,而是要找到最接近的p.val:所以loop终止条件是直到p==root or root is None,过程中只要>p.val就记录successor:这…
Find the Celebrity 要点: 这题从solution反过来想比较好:loop through n同时maintain一个candidate:如果cand认识某个i,那么modify cand.实际上检查另一个条件i不认识cand也可以,因为这2个条件是exclusive的 这个过程保证了cand不认识其之后的所有人.两个问题: 一是会不会漏掉之前可能的celebrity呢?不会,如果当前cand不know i,i不可能是candidate. 因为只是确保了之后的所有人,会不会是F…
Best Meeting Point 要点: 题本身不难理解,manhattan distance.follow up就变成weighted了(因为一个地方可以有多个住户) 注意input是grid的形式,一种方法是2d iterate,然后用两个数组分别存x,y,只需要对column sort,row是按顺序的iterate的.最后直接取中 这题之所以是Hard,因为有另一种方法:不用sort,不用找median,类似于nested weighted sum II,只不过变成双向而非单向 假设…
Word Pattern II 要点: 注意与I的差异,其实题不难,看到这种迷乱的,首先要想到backtrack 1:1 mapping两个条件:p in and str in, or p not in and str not in values(). 错误点: false的退出条件是pattern没有足够字符1:1了(i.e., len(pattern)>len(str)),但true的条件是pattern和str都比完了 https://repl.it/CekC/1 # Given a pa…
Unique Word Abbreviation 要点: 简单题,主要是理解题意.no other words have the same abbreviation as the given word意思就是如果没有同样的abbrev或者有但是只由dict中相同的word产生. 可以用True/False表示unique,同时用set来保存哪个word产生的abbrev https://repl.it/CnNt # An abbreviation of a word follows the fo…
Smallest Rectangle Enclosing Black Pixels 要点:记题:这题有两个限制条件:所有black pixel是连通的(所以可以用binary search)以及给了一个black pixel. 错误理解:给定black pixel所在行/列的top/down/left/right是不正确的.因为这题为2d,二分的条件是一整行/列上是否有black pixel,也就是把整个行/列作为一个元素,而对应的列/行作为搜索array.给定的点只是作为low/high的初始…