06 2016 档案
摘要:Wiggle Sort II 要点:这题就是关于如何按序插入,基本的logic这个帖子介绍的很清楚:https://leetcode.com/discuss/76965/3 lines python with explanation proof。简单的方法就是先排序,O(nlgn)。python可以
阅读全文
摘要:Top K Frequent Elements 要点: java: PriorityQueue的definition:Comparator:是一个generic interface,所以new Comparator():加括号表示,同时implement interface 用 {}。内部实现@Ov
阅读全文
摘要:Flatten Nested List Iterator 要点:题的本质是建立next和isInteger/getList/getInteger的关系,考点和tree的遍历类似:用stack存dfs的trace,这样可以backtrack到之前层的结点。 注意NestedInteger类的表示,清楚
阅读全文
摘要:Counting Bits 要点:这题一开始没想出来,看了hint解出来了。估计想时间长点是可以想出来的。就是gray code的类似思路,新序列就是已经得到结果的序列左边高位补1,所以即1的个数+1。所以按这个顺序iterate多遍直到某个值超过了num class Solution(object
阅读全文
摘要:Odd Even Linked List 要点:实现题,最简单的方法就是交错的连接even/odd的下一个结点。p1表示当前已经连好的odd,p2表示当前已经连好的even。最后只需要开始记录even的head,就可以用最后p1.next来连成一个linked list。 invariant是p2
阅读全文
摘要:Increasing Triplet Subsequence 要点: 第一遍没想出来,想到了要记录min (m1) 和min pair (m2),其实就差一步。这题tricky的地方是m1和m2是各自独立的两个状态:m2差一步就进化到triplet,而m1还差两步。可能m2对应当前m1进化的,也有可
阅读全文
摘要:Reconstruct Itinerary 要点:注意这题不是让找cycle,只需要从”JFK"开始cover所有站就可以。所以基本方法就是按图做dfs遍历直到找到一条valid的路径 dfs找路径的要点有二:1是返回boolean来表示是否找到,从而可以直接返回,2是在每一个点分支要不断push=
阅读全文
摘要:Reconstruct Itinerary 要点:注意这题不是让找cycle,只需要从”JFK"开始cover所有站就可以。所以基本方法就是按图做dfs遍历直到找到一条valid的路径 dfs找路径的要点有二:1是返回boolean来表示是否找到,从而可以直接返回,2是在每一个点分支要不断push=
阅读全文
摘要:Verify Preorder Serialization of a Binary Tree 要点:第一遍就做出来了,invalid的只有2种情况:一是在某个结点时(包括null)发现没有字符了,二是当遍历完在最外层,发现还有字符没用 错误点: 因为index是到最后一个元素中止的,所以情况2的过界
阅读全文
摘要:Additive Number 要点:实现题,三层loop:方式是外层确定前2个数的边界i,第二层确定第一个数的边界j。 确定了前两个数后就loop是否为正确序列:这里最好另用个函数,why? 逻辑上False退出循环后要进入下一次,但是True的情况也是从内层循环结束,但不进入下一层。如果用函数,
阅读全文
摘要:Maximum Product of Word Lengths 要点:一开始的方法想错了,以为可以用并查集做,把凡是有相同char的word放到同一组中,然后在不同的组之间做乘法。但是后来发现这个想法有bug,比如ab,bc,cd是同一组,但是ab和cd也可以做乘法。所以并查集的适用条件是所有元素要
阅读全文
摘要:Coin Change 要点:一开始用了按amount循环的dp方法,结果对于大数,比如9936就TLE了。dp实际就是一种bottom up的方法(而recursion是top down)。所以另一种dp方法就是把已经cover的值放到集合中,下一步从集合中取出每一个值更新后再加入集合。可以看出这
阅读全文
摘要:Bulb Switcher 要点:数学题一直是弱项,关键是推理思维总是不清晰。比如这题,模糊的知道因子对决定了最后亮灯的个数,但是具体的推理就没记住 先说答案,因为code极其简单:int(math.sqrt(n)) 开始的时候理解错误,every second的意思是从2开始每隔2(1开始计数),
阅读全文
摘要:Maximum Product of Word Lengths class Solution(object): def maxProduct(self, words): """ :type words: List[str] :rtype: int """ es = [] for w in words
阅读全文
摘要:Bulls and Cows 要点:类似于Word Pattern,guess和secret要存成两个counts,因为guess中了的可能在secret之前出现,vice versa。另一种方法是可以多遍统计:先过一遍secret,然后过一遍guess统计cows,最后统计bulls调整cows
阅读全文
摘要:Serialize and Deserialize Binary Tree 要点:preorder traversal,node allocation是在function里:意思是如果有一个新值,那么allocate一个node,同时因为python不支持pass by reference,所以le
阅读全文
摘要:Word Pattern 要点:和isomorphic string就是同一题。 错误点: 别忘了先比长度
阅读全文
摘要:Game of Life 要点:这题首先要记住题, 具体来说题的核心是什么:即2d处理的两步顺序的矛盾:如果前一步处理了并记录了,那么后面的处理需要的信息就被wipe了。这题处理的方法就是记录的信息要包含修改之前和之后的信息,一共有4种可能情况:live = live, live = dead, d
阅读全文
摘要:Peeking Iterator 要点:想成cache会比较容易理解,要进一步要考虑什么时候put to cache和什么时候invalidate cache, put to cache:peek的时候,如果没在cache中,因为iterator已经移动,直到下一次next,都要在cache中找。
阅读全文
摘要:Move Zeroes 要点:这题2个要点:保持顺序,0要到最后,所以必须从前向后处理。基本的rule就是每遇到一个非0就和下一个位置(必然为0)交换,当然要判断是否当前就是"下一个位置”,这种情况就不用交换了。 facebook还考过一道类似题,不需要0移到后面,也不需要保持顺序,只需要把非0移到
阅读全文
摘要:H Index I/II 要点: 一般规律:参见图 https://snag.gy/apYLHV.jpg:个数i和citations的关系。如果按citations值从大到小排序,越向右citation越小,而i越大。条件的后半部分限制了必须找到i和citations的临界点,也就是第一个i坐标 =
阅读全文
摘要:Single Number III 要点:这题和I一脉相承,从1个不同变成2个不同,其他数是配对。而II是三个重复 逻辑:因为全部数的xor值在其他两两相同值消掉之后,剩下2个异类的xor相当于二者的不同的位。这样可以根据最低不同位把2个不同数选出来:把其他数分成两组再按I的方法选。
阅读全文
摘要:First Bad Version 要点:本质上就是 =的bounded binary search,因为在某一点之后都是bad version,目标是找到起点。 错误点: =并不是(low+high+1)/2,low=mid的情况才是,也就是
阅读全文
摘要:Integer to English Words 要点:类似roman to integer,三位一组计算,要点: 要从低位开始,因为不知道最高位实际是哪个位。类似的最高三位可能有短缺位,所以先reverse整个string以便3位一组loop的时候不会漏掉最高位(这个也是错误点)。 错误点: Te
阅读全文
摘要:Add Digits 要点:暴力解肯定是不行的。这题就是一道小学数学题:num = (a + b + c + d + e) + (a 9999 + b 999 + c 99 + d 9),所以两边%9是一样的。这样右边重复这个公式(可以利用(x + y) % z = (x % z + y % z)
阅读全文
摘要:Lowest Common Ancestor of a Binary Tree 要点:这题和Binary Search Tree的版本递归都很简单,问题是如何用iteration来做。BST比较简单,直接沿一条分支搜索即可。而Binary Tree需要用post order traversal的方法
阅读全文
摘要:Ugly Number I/II 要点:I/II之间其实没多大关联,II和Super Ugly Number一样。基本思路就是逐个计算下一个ugly number直到n,用三个指针point2, point3, point5记录前一个 2, 3, 5的位置。如果已经刚刚相乘取得新数,移动到改指针下一
阅读全文
摘要:Binary Tree Paths 要点:题很简单,不过对于递归方式很有启发性: 因为root和子树的处理是不同的(root不用加” "),所以对root要在递归开始之前处理(也就是添加到res),类似于array中0单拿出来。 因为leaf node有两个分支,如果等node为空的时候push s
阅读全文
摘要:Lowest Common Ancestor of a Binary Tree 要点:这题和Binary Search Tree的版本递归都很简单,问题是如何用iteration来做。BST比较简单,直接沿一条分支搜索即可。而Binary Tree需要用post order traversal的方法
阅读全文
摘要:Valid Anagram 要点:简单题,但是不要和Anagram那题用同样的方法验证,那题需要多个string之间找anagram,所以要encoding,而这题只是2个之间,就用一个count map然后一个加一个减就可以。为了简化条件,可以用collections.defaultdict(in
阅读全文
摘要:Different Ways to Add Parentheses 要点:这题是另一种递归方式:分治,进一步说是catalan number方式的分治。比较有意思的是和Remove Invalid Parentheses这题的对比,remove里是从左到右递归。首先这题肯定不能这样递归,因为没法同步
阅读全文
摘要:Search a 2D Matrix II 要点:不讨论O(n)算法,O(lgn)的算法可以用四分法,每次可以去掉2个象限,如何想是哪两个?按照递增的顺序,如图。注意这题的binary search部分不是search target或者 =target, 而是普通的binary search,只是在
阅读全文
摘要:Sliding Window Maximum 要点:这题O(nlgk)的算法很简单,就是用个max heap,当然还有O(n)的算法。具体的就是用deque,deque中maintain从大到小的顺序。显然,deque头就是每个sliding window的max值。这里的问题是移动到下一个元素的时
阅读全文
摘要:Product of Array Except Self 要点:和Candy之类的都是一个路数,注意这题已经限定了n 1,所以不用考虑n
阅读全文
摘要:Delete Node in a Linked List 要点:简单题,把下一个值移到当前值,然后把下一个删除(就是node.next连接到node.next.next) 错误点: 注意不是和最后一个交换,之所以会错是因为要检查node是不是最后一个,只有不是队尾才能这么做 不是循环左移,O(1)就
阅读全文
摘要:Palindrome Linked List 要点:暴力解,找到中点,然后reverse后半段,再从两边向中间比较。 错误点: reverse中pre初始为None而不是slow:因为有可能odd或者even,所以从两边向中间可能left.next==right或者left==right。第一种情况
阅读全文
摘要:Number of Digit One 要点:从低到高每一位累加,需要highbits,lowbits,base。基本的rule是每隔base会有1个one,一共多少个base?有3种情况 1, ==1, 1有highbits+1,0,而不是n highbits/lowbits/curbit要在lo
阅读全文
摘要:Power of Two/Power of Three/Power of Four 要点:Two和Four是类似思路,Four扩展到只在偶数位。Three是另一个思路,而这种思路只适用于3为prime:找到小于INT_MAX的最大的3 3 …. 3(3^19),n如果是3^m,那么可以整除这个最大值
阅读全文
摘要:Majority Element II 要点:无论是1个majority,2个majority还是k个,都是三种情况:count+1,all count 1,情况变化发生在0(初始或者减到0)。重要的是三种情况的验证顺序:首先cand已经存在,那么对应count+1,else:检查0,初始化,els
阅读全文
摘要:Basic Calculator I/II 要点:这类题无论怎么变化,都有基本模式:两个stack,一个ops,一个oprand。遇到oprand就push,遇到ops要分情况。 ‘)’:括号里的结束。rewind or keep call computeAndPush ‘(’:just push
阅读全文
摘要:Summary Ranges 要点:简单题,但如果用start标记求解,有一重要点,即最终边界条件是i==n。这里就有一个问题,什么时候用i==n,rule就是看下一段的开始条件和本段的结束条件在哪:如果本段结束等于下一段开始,那么最后的边界条件是i==n(因为这个相当于一个dummy的下一段),本
阅读全文
摘要:Shortest Palindrome TLE:用isPalin function肯定会超时,最好的方法是先reverse string然后再和自身比较 class Solution(object): def shortestPalindrome(self, s): """ :type s: str
阅读全文
摘要:Implement Stack using Queues 要点:因为queue的是FIFO,所以要用2个queue配合来实现LIFO。2种方法:push O(1) or pop O(1)。基本思路就是如果push O(1),那么queue中的元素还是FIFO,pop的时候调整。而pop O(1),在
阅读全文
摘要:Invert Binary Tree 要点:这题很简单,一点点扩展是如果iterative做。pre order还是post order呢?根据recursion,因为既可以先reverse再递归,也可以先递归再reverse,所以没有区别。in order可能也能用,不过会比较复杂。这题说明bin
阅读全文
摘要:Word Search II 要点: board作为visited。为什么dfs最后要unset visited?visited的意义是在当前的dfs stack内,对这题也就是当前path。下一层dfs之后,当前path结果已经得到,但是改点还可能在其他的path上,所以要把visited uns
阅读全文
摘要:Count Complete Tree Nodes 要点:递归的思路 复杂度:因为左右子树最差情况必然一个full一个complete,所以只有一边是继续递归的。另一边下一层就返回了。所以主定理:O(n)=O(n/2)+lgn = O(lgn) O(lgn) 错误点:注意公式:2^h 1, h是bi
阅读全文
摘要:Rectangle Area 要点:基本思路就是先分开算再减去相交部分,这题的难点是如何检查是否相交和如何算出相交部分的面积。 2d转化为1d:x轴和y轴是orthogonal的。可以分开考虑。这样检查不相交很简单,4个or条件。注意x/y轴只要一个不相交就完全没交集 相交部分如何算?还是x/y轴分
阅读全文
摘要:Maximal Square 要点:这题猛一看和Maximal Rectangle很像,其实不然。因为正方形边长相等,实际可以降维。如图,A,B,C三部分构成了除当前点之外正方形的三个部分,所以如果当前点为’1’,那么上面三部分的最小值(其实等同于一边的最小值,所以dp中存的就是一边的长度)为当前点
阅读全文
摘要:The Skyline Problem 要点:这题是难题,但是是重点难题,因为google常考,而且很多变形。题本身的pattern就是从左到右更新区间内存在值的最大值(对于这题就是skyline)。最简单的解法就是从左到右根据每个区间的enter/exit point更新存在值的集合。 同时因为区
阅读全文
摘要:Contains Duplicate I/II/III 要点:I/II都很简单,对于II注意题意是是否在sliding window内存在相等的元素,不是所有相等的都间距小于k。重点说III:对于间距小于k这个条件,还是用sliding window。当检查一个新元素的时候,踢出最老的元素。同时要判
阅读全文
浙公网安备 33010602011771号