摘要: Populating Next Right Pointers in Each Node I/II 要点:stack在traversal中的作用是回到root,这题只需要2层之间的关联。所以不需要stack来track。这题就归结为通过当前层连接下一层然后再到下一层。所以code pattern是 w 阅读全文
posted @ 2016-05-22 03:04 absolute100 阅读(130) 评论(0) 推荐(0) 编辑
摘要: Dungeon Game 要点: 要区分点为单位或者边为单位,这题是点为单位 dp思路很容易想,关键是具体的是什么: 优化目标?某点的生命值,限制条件:生命值不能低于1(与障碍物的题不同,障碍物是优化值取最差) 从目标点开始回溯到起点 所以最下一排和最后一列是特殊情况初始化 仔细看这题其实就是can 阅读全文
posted @ 2016-05-20 07:32 absolute100 阅读(94) 评论(0) 推荐(0) 编辑
摘要: Factorial Trailing Zeroes 要点:这题heuristic很容易想,就是所有可被5整除的数都会贡献一个尾0。但是每次实现都会错想成+5循环,这样time complexity就是O(n)了,而要求的是O(lgn)。实际上应该是检查n有多少5整除数:这个数量可以一步计算出来,而累 阅读全文
posted @ 2016-05-20 07:23 absolute100 阅读(104) 评论(0) 推荐(0) 编辑
摘要: Excel Sheet Column Number Excel Sheet Column Title 要点: 数字= 字母:基本上和10进制计数类似,区别是起始值为1,所以进位和起始值是一样的。而不像10进制,起始为0,进位为1。这里只在’Z’特殊处理,因为余数为0并不表示进位,而是最后一个字母’Z 阅读全文
posted @ 2016-05-20 07:19 absolute100 阅读(105) 评论(0) 推荐(0) 编辑
摘要: Fraction to Recurring Decimal 要点: 基本公式:当余数小于除数,那么X10然后继续,这个意思就是小数位的数值表示的是余数相对于除数在10中占几份。 注意小数点左边是不用按位计算的,直接一个除法 如何计算循环部分?因为循环部分只会出现在末尾,直观的想法是最后再把循环位补到 阅读全文
posted @ 2016-05-19 11:28 absolute100 阅读(101) 评论(0) 推荐(0) 编辑
摘要: Compare Version Numbers 题本身思路简单没什么可说的。值得一提的是corner case:多出来的0和没有是相同版本,这样最简单的处理是直接对没有的补0。这样因为需要补齐,循环是到最长的版本。 class Solution(object): def compareVersion 阅读全文
posted @ 2016-05-19 11:25 absolute100 阅读(86) 评论(0) 推荐(0) 编辑
摘要: Find Peak Element 要点:binary search的依据:三种情况之一:上坡,下坡和峰值点。边界条件和一般情况分开判断,这样branch不会很复杂。更简单的思路是只沿着上坡找。因为一定有peak存在所以最终的落点就是peak。 错误点: 因为invariant是low 阅读全文
posted @ 2016-05-19 11:22 absolute100 阅读(88) 评论(0) 推荐(0) 编辑
摘要: Find Peak Element 要点:binary search的依据:三种情况之一:上坡,下坡和峰值点。边界条件和一般情况分开判断,这样branch不会很复杂。更简单的思路是只沿着上坡找。因为一定有peak存在所以最终的落点就是peak。 错误点: 因为invariant是low 阅读全文
posted @ 2016-05-19 07:36 absolute100 阅读(91) 评论(0) 推荐(0) 编辑
摘要: Max Points on a Line 要点:这题暴力解是用任何两点确定一条直线,然后对其他点检查是否共线,显然,这里没用空间来存储之前的检查结果,所以time complexity是O(n^3)。这题的难点是如何存储从而实现O(n^2)解。思路是另一种确定一条直线的方法是一点和theta,所以t 阅读全文
posted @ 2016-05-18 11:59 absolute100 阅读(129) 评论(0) 推荐(0) 编辑
摘要: Sort List 要点:merge sort,recursion function不需要head和tail头尾指针来限定范围,直接把前后子list断开。用fast.next作为2指针条件,这样最后落在偏左边的结点,也就是后一个list的前一个元素 Definition for singly lin 阅读全文
posted @ 2016-05-18 11:56 absolute100 阅读(100) 评论(0) 推荐(0) 编辑
摘要: Min Stack 简单题,注意的是push()的时候如果新元素和stkmin栈顶一样,也要push到stkmin,否则几个连续的最小元素push会出错。 阅读全文
posted @ 2016-05-18 11:34 absolute100 阅读(99) 评论(0) 推荐(0) 编辑
摘要: Maximum Product Subarray 错误点: globalmax应该初始化为 inf,因为可能是negative 因为要分两步更新localmax和localmin,所有要先把旧的localmax存起来以便更新localmin(假设先更新localmax) 阅读全文
posted @ 2016-05-18 10:24 absolute100 阅读(96) 评论(0) 推荐(0) 编辑
摘要: Intersection of Two Linked Lists 要点:超有B格的写法:同步移动指针A和B,如果其中任何一个为空了,redirect到另一个。如果中间有重叠说明是交汇的。原理就是无论在哪个结点相交,两个指针最终保证走的距离是相等的。起始位置距离相交点的差别被补齐了。 pattern: 阅读全文
posted @ 2016-05-18 08:02 absolute100 阅读(94) 评论(0) 推荐(0) 编辑
摘要: Reverse Words in a String 不知道为什么in place的会超时,不过这题也没要求,做II的时候看看还超不超时。这题可以one liner:return " ".join(s.split()[:: 1]) 阅读全文
posted @ 2016-05-18 07:58 absolute100 阅读(92) 评论(0) 推荐(0) 编辑
摘要: Reverse Words in a String 不知道为什么in place的会超时,不过这题也没要求,做II的时候看看还超不超时。这题可以one liner:return " ".join(s.split()[:: 1]) 阅读全文
posted @ 2016-05-18 07:52 absolute100 阅读(106) 评论(0) 推荐(0) 编辑
摘要: Reverse Words in a String 不知道为什么in place的会超时,不过这题也没要求,做II的时候看看还超不超时。这题可以one liner:return " ".join(s.split()[:: 1]) 阅读全文
posted @ 2016-05-18 07:49 absolute100 阅读(93) 评论(0) 推荐(0) 编辑
摘要: LRU Cache 这题调了好几天才pass 要点:用doubly linked list, deleteNode和addNode分开考虑,分开考虑,分开考虑,重要的事情说三遍 需要dummy node和tail,deleteNode考虑tail,addNode考虑dummy.next(因为addN 阅读全文
posted @ 2016-05-17 10:41 absolute100 阅读(125) 评论(0) 推荐(0) 编辑
摘要: Find Minimum in Rotated Sorted Array II, Search in Rotated Sorted Array II: 注意这两题都是对nums[mid]和nums[low]进行if...elif...else分支而不是nums[low]和nums[high],这几题 阅读全文
posted @ 2016-05-17 10:38 absolute100 阅读(77) 评论(0) 推荐(0) 编辑
摘要: Find Minimum in Rotated Sorted Array 要点:low=nums[low]: low = mid+1 else: high = mid return nums[mid] ``` 阅读全文
posted @ 2016-05-17 10:36 absolute100 阅读(81) 评论(0) 推荐(0) 编辑
摘要: Evaluate Reverse Polish Notation 这里需要注意的一点是python中的'/'除法和c语言不太一样。在python中,( 1)/2= 1,而在c语言中,( 1)/2=0。也就是c语言中,除法是向零取整,即舍弃小数点后的数。而在python中,是向下取整的。而这道题的oj 阅读全文
posted @ 2016-05-16 10:45 absolute100 阅读(96) 评论(0) 推荐(0) 编辑
摘要: Insertion Sort List 又是4结点互连的问题。规律就是用cur.next作为当前。 Definition for singly linked list. class ListNode(object): def __init__(self, x): self.val = x self. 阅读全文
posted @ 2016-05-16 10:44 absolute100 阅读(99) 评论(0) 推荐(0) 编辑
摘要: Flatten Binary Tree to Linked List 同理,这题递归的解法trivial,试着用iterative解了下,后续遍历,然后找左子树的右孩子。然后…就不需要然后了 阅读全文
posted @ 2016-05-15 09:15 absolute100 阅读(107) 评论(0) 推荐(0) 编辑
摘要: Reorder List 要点:算法直观不多讲,这题就是实现有些细节要注意 同样是前面提到的slow和fast的算法最终slow落在奇数结点中点或者偶数结点的中间右侧。所以第二步reverse的起点是slow.next:奇数很明显,偶数个,右面list的第一个结点是reverse后的最后一个结点,是 阅读全文
posted @ 2016-05-13 10:52 absolute100 阅读(99) 评论(0) 推荐(0) 编辑
摘要: Binary Tree Postorder Traversal 这题前面提过,思维方式就是每一层先检查是不是从上到下,然后检查是不是从左边回来的,最后如果是从右边回来的,后续访问。 错误点: 从上到下的时候left和right进栈是if/else的关系 阅读全文
posted @ 2016-05-13 10:51 absolute100 阅读(93) 评论(0) 推荐(0) 编辑
摘要: Linked List Cycle I/II fast/slow指针的移动方式:fast先移动,然后检查fast again,同时移动fast和slow 阅读全文
posted @ 2016-05-13 10:49 absolute100 阅读(97) 评论(0) 推荐(0) 编辑
摘要: Word Break I/II 现在看都是小case题了,一遍过了。注意这题不是np complete,dp解的time complexity可以是O(n^2) or O(nm)。所有解的个数是exponential的 (比如”aaaa....”, dict="a, aa”)。以前在amazon o 阅读全文
posted @ 2016-05-12 11:01 absolute100 阅读(100) 评论(0) 推荐(0) 编辑
摘要: Single Number I/II II的python解是网上抄的,其实可以AC,但是python不会像c++/java那样自动overflow,而是转化成long。所以如果有负数的情况会得到一个巨大的正数解,比如 Input:[ 2, 2,1,1, 3,1, 3, 3, 4, 2] Output 阅读全文
posted @ 2016-05-12 11:00 absolute100 阅读(143) 评论(0) 推荐(0) 编辑
摘要: Gas Station 老题,这种circular的题一般都能转化成单向的。比如这题就是用sumDiff来判断是否有解,而start单向递增。 阅读全文
posted @ 2016-05-12 10:59 absolute100 阅读(111) 评论(0) 推荐(0) 编辑
摘要: Clone Graph dfs或者bfs都可以做,这题的要点是hashmap有两个作用:一是图遍历中的visited,另一个是存copy的结点来连接neighbors。hashmap即表示visited,同时存某个结点的copy(这里有copy了就是已经visited)。 bfs和dfs本身特性的区 阅读全文
posted @ 2016-05-12 10:58 absolute100 阅读(102) 评论(0) 推荐(0) 编辑
摘要: Copy List with Random Pointer 思路很容易理解,这题连接完了cur.next是永远存在的,所以copy random link的时候不用特殊处理。break因为一轮包括4个结点,另外在list结尾有特殊情况,所以比较复杂 顺序:以当前(cur)和下一个(被copy结点)为 阅读全文
posted @ 2016-05-12 10:57 absolute100 阅读(93) 评论(0) 推荐(0) 编辑
摘要: Candy 要点:又是左右扫描的题,从左向右简单,就是初始为1,和左边的rating比较。从右向左就直接用一个right变量,这个值每次更新都是最终i的糖果数同时作为前一个最终值的依据:初始为最后一个left的值,之后就是根据rating更新取大。 阅读全文
posted @ 2016-05-11 11:06 absolute100 阅读(84) 评论(0) 推荐(0) 编辑
摘要: Palindrome Partitioning I/II 要点:palindrome的题,一般是从两边匹配,这题有一个好方法是从中心匹配。外循环loop on所有的中心点,然后对奇偶情况分别向两边匹配。这样可以用1d空间来存结果。 dp的要点:dp数组本身还是表示前i个元素的palindrome p 阅读全文
posted @ 2016-05-11 11:05 absolute100 阅读(96) 评论(0) 推荐(0) 编辑
摘要: Longest Consecutive Sequence 弱智了,这题总以为有一遍扫描的方法。其实需要两遍扫描,第一遍存索引,第二遍计算最长。第二遍实际就是图遍历。 确实有一遍扫描的方法,思路类似union find,只是这题作为同一个set的条件是检查neighbor是否在map中。而只需要更新左 阅读全文
posted @ 2016-05-10 11:11 absolute100 阅读(101) 评论(0) 推荐(0) 编辑
摘要: Surrounded Regions 要点 之所以从边上开始dfs/bfs,是因为中间的点是没法直接判断是否被包围的,而从边上走,可以立刻判断点是连通的。 这题不需要visited,直接用board上的mark来判断,因为如果是’X’,本来就不继续了,而如果是’O’。只有被mark了,才确定是通的, 阅读全文
posted @ 2016-05-10 11:10 absolute100 阅读(91) 评论(0) 推荐(0) 编辑
摘要: Word Ladder I/II 网上著名的难题,一般被黑了都说自己被考了Word Ladder。其实这题I还好,II比较变态,不过知道答案了不难理解。 要点: 因为是最短长度,所以bfs找到的可以从字典里去掉。 bfs从两头做最好,哪个方向集合元素少就作为下一轮的种子 google还考过扩展:减字 阅读全文
posted @ 2016-05-10 11:09 absolute100 阅读(85) 评论(0) 推荐(0) 编辑
摘要: Binary Tree Maximum Path Sum 错误点:negative也可能是最大值,所以global maxVal初始值为INT_MIN。但是左右传上来的一侧值(left or right)一定要先和0比较再加到local maxVal做比较,因为如果left or right是neg 阅读全文
posted @ 2016-05-09 09:06 absolute100 阅读(87) 评论(0) 推荐(0) 编辑
摘要: Best Time to Buy and Sell Stock III/IV IV是k的解,可以特殊化到2的。有趣的问题是III的左右两遍扫描解法和IV的关联性。其实在从左向右扫描的时候就是更新global[i][1],从右向左扫描是更新global[i][2](基于global[i][1])。为什 阅读全文
posted @ 2016-05-09 09:04 absolute100 阅读(97) 评论(0) 推荐(0) 编辑
摘要: Populating Next Right Pointers in Each Node I/II 要点:stack在traversal中的作用是回到root,这题只需要2层之间的关联。所以不需要stack来track。这题就归结为通过当前层连接下一层然后再到下一层。所以code pattern是 w 阅读全文
posted @ 2016-05-07 09:10 absolute100 阅读(78) 评论(0) 推荐(0) 编辑
摘要: Path Sum I/II 同上,preorder搞定。这题竟然犯了2个错误。 错误点 pop不能发生在入左右子树之后 每个节点对应的sum值是减去该节点的val,所以root初始要减去val II用递归做的。递归里,root不为None,而且在外层更新sum,内层只是中止条件判断(sum为0,左右 阅读全文
posted @ 2016-05-05 09:25 absolute100 阅读(76) 评论(0) 推荐(0) 编辑
摘要: Minimum Depth of Binary Tree 同理,这题用preorder iterative搞定。注意即使是preorder一个高度变量是不够的。因为在同一高度同时入栈左右,左边出栈后并不知道当前栈内的是右子树还是上一层。这样就没法用同一个变量track height了 Definit 阅读全文
posted @ 2016-05-05 09:17 absolute100 阅读(98) 评论(0) 推荐(0) 编辑