08 2018 档案
摘要:300. Longest Increasing Subsequence brute force做的话,递归来做,每个元素在不在subsequence中,时间复杂度O(2^n) 方法一:DP 由于只需要求个数,不需要把subsequence求出来,很自然想到dp dp[i] 表示以 a[i] 为结尾的
阅读全文
摘要:排序题的变种,对于a和b,如果a+b>b+a,那么a排在b前面。 复习一下 sort 函数,如果cmp写在里面的写法:[](int a, int b){return a>b;}
阅读全文
摘要:方法一:Divide and Conquer 数组第一个一定是根,第一个大于根的一定是右子树的根,因此我们可以把 根,左右子树都区分开来。判断根是否在合理范围内,如果在,在分别判断左右子树。思路清晰,也很容易写。 Time: O(nlogn) 方法二:Stack 维护一个单调递减的栈。如果当前元素比
阅读全文
摘要:方法一:Brute Force 对于每个节点,计算以该节点为root时所有可能的个数。 Space: O(h), O(logn)~O(n) Time: calpath O(n), 对于dfs, T(n) = 2T(n/2)+O(n) 所以总的时间复杂度O(nlogn),当然这是在balanced t
阅读全文
摘要:格雷码,大学电路与电子学没好好上,哎。 最容易理解的方法是 镜面生成, 把原数组反过来最高位补1即可。
阅读全文
摘要:116. Populating Next Right Pointers in Each Node 直接做的话用levelOrder做即可,但是要求空间复杂度O(1),所以不行。 Recursive 这里递归是preOrder,一定要先将root的左右儿子连接起来,后面递归才能继续连接。 这里每次df
阅读全文
摘要:Boomerang 回旋镖的意思,本题意思是寻找 abc的点对,使得ab,ac距离相等。 一个循环固定a,计算其余的点到a的距离,简历一个hashtable,保存对应距离的点的个数。 如果有n个点到a距离相等,那么一共有 P_n^2 种可能 (题目中提到不同顺序算多种) 149. Max Point
阅读全文
摘要:方法一:Inorder Traversal Binary Search Tree 的一个性质就是 inorder 遍历的时候是有序的。 这道题和 426. Convert Binary Search Tree to Sort Doubly Linked List 类似,需要一个 prev 指针记录前
阅读全文
摘要:利用matrix的第一行和第一列来记录,第二遍扫描时再根据记录的信息把matrix的元素置0。
阅读全文
摘要:如果把矩阵元素看做点,小的元素到打的元素看做边连起来,这道题等价于在一个有向图中寻找最长路径。 第一想法是用dfs或bfs,但是直接做超时了。以dfs为例,时间复杂度为O(2^(m+n)),空间复杂度O(h)=O(mn) 由于dfs中很多节点的最长路径都被重复计算了,因此可以 Memorizatio
阅读全文
摘要:15. 3Sum Two Sum 的 follow up Two Sum 使用hashtable做到O(n)时间复杂度 所以看到这道题,第一想法是固定一个元素,剩下的用 Two Sum 处理。但是由于这道题有重复元素存在,最后去重会TLE,因此不能这样做。 在一个有序数组里寻找加和为给定值的两个元素
阅读全文
摘要:isdigit(), isalpha(), isalnum() 用来判断是否是数字,是否是字母,是否是数字+字母 toupper(), tolower() 对char大小写切换
阅读全文
摘要:这道题本质上和 Climbing Stairs 那道DP题是一样的,但是由于 decode 有范围限制,所以写起来有很多条件。 dp[i] 表示到下标为i为止的字符能得到的解码个数 dp[i] += dp[i-1] if s[i]!='0' += dp[i-2] if s[i-1:i+1] in "
阅读全文
摘要:DP问题,有点难想,但是理解以后不难。 记 dp[i][j] 为以 a[i][j] 为右下角的正方形的最大边长。 递推公式写起来不难,dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1 if a[i][j]==1 如下图所示,较小的边+1
阅读全文
摘要:Facebook full-time 的面试题。 遇到这种数字的题,第一感觉就是递归。而且一定要问清楚数字给定的范围,会不会是负数,有没有范围等等。题目给定了范围 0~2^31-1,因此最高到 billion。 根据大小来拆分然后递归,注意一些corner cases,1~19,20,30,…… 总
阅读全文
摘要:当前height下, 分别表示 a[i][j] 向左和向右能扩展的位置下标(右下标要+1,这样右-左刚好是矩形的宽)
阅读全文
摘要:这道题是 53. Maximum Subarray 的变形。由于负数的存在,max_ending_here[i] 可能是以下三种情况。 max_ending_here[i] * nums[i] nums[i]>0 min_ending_here[i] * nums[i] nums[i]<0 nums
阅读全文
摘要:Recursive 一开始我想用preorder加上prev指针来做,但是很快就发现了问题。由于preorder,root先处理,而在本题中,即先将root加到之前的prev之后。假如树是 (1 (2) (3)),dfs到节点2时,prev->right=root 会使得1的右儿子变成2,这会使得节
阅读全文
摘要:和 148. Sort List 一样的思路,需要把链表一分为二,利用快慢指针即可。 需要注意的是,写完一定要 两个节点 三个节点 代入几个 test case 检查一下,非常容易出错。下面做法是把最后slow的位置作为 root,递归左半边和右半边。 时间复杂度 O(nlogn) 空间复杂度 O(
阅读全文
摘要:第一想法是建立一个足够大的bool数组,i遍历,如果nums[i]是ugly num,那么 2*nums[i] 3*nums[i] 5*nums[i] 一定也是 ugly num。最后遍历一遍找到第n个,但是这样空间会超,不行。 继续这个思路,可以利用一个优先队列,重复元素直接过掉,可以AC。但是时
阅读全文
摘要:方法一:pop count 利用 191. The number of 1 bits 中的方法,算是bit manipulation 中的巧妙操作,每次 n = n&(n-1) 把最低位的 1 置为 0 。 时间复杂度 O(nk),k表示数字中1的位数。 方法二:DP DP方法有很多,如 dp[i]
阅读全文
摘要:这道题和树基本没什么关系,完全就是 Catalan Number。 给定一个数 i , 1作为根,左边有 0 个节点,右边有 i-1 个节点 2作为根,左边有 1 个节点,右边有 i-2 个节点 ... i 作为根,左边有 i-1 个节点,右边有 0 个节点 记 dp[i] 为给定 i 时的个数,d
阅读全文
摘要:二叉查找树的套路一般都是 先根据 root->val 和一些条件缩小范围。 本题中,如果 根节点小于L,递归右子树,如果大于R,递归左子树。如果在两者之间,表明root一定是符合要求的,递归左子树和右子树,并和root接起来。 时间复杂度 O(n),最多访问每个节点一次。 空间复杂度 O(h) 递归
阅读全文
摘要:236. Lowest Common Ancestor of a Binary Tree 递归寻找p或q,如果找到,层层向上返回,知道 root 左边和右边都不为NULL:if (left!=NULL && right!=NULL) return root; 时间复杂度 O(n),空间复杂度 O(H
阅读全文
摘要:二叉树的问题,这里主要关心一下时间复杂度。 先回忆一下求二叉树深度的问题,T(n) = 2T(n/2)+1 -> O(n) 本题 T(n) = 2T(n/2) + O(n) -> O(nlogn) 最坏情况是O(n^2) 可以继续优化,一旦发现子树不是平衡的,返回-1,最后只要判断 f(root)!
阅读全文
摘要:这几道题都是pattern的题目, Isomorphic Strings 和 Word Pattern 是完全一样的问题,Find and Replace Pattern 本质也一样。 第一种思路,建立两个map,将字符(或字符串)映射到所在的位置 i+1,每次只需要判断 map1[a]==map2
阅读全文
摘要:看起来很难,但是仔细想一下,实质就是二叉树的中序遍历的问题,中序遍历有递归和非递归(至少两种写法)。 递归: 非递归 Divide and Conquer 思路和中序遍历很类似,但是代码写起来有一点不一样。感觉这种方法思路更加清晰。
阅读全文
摘要:方法一:Backtracing (DFS) 非常典型的回溯,必须烂熟于心。 方法二:迭代 把当前的结果vector里的所有元素 都加上当前的元素 push_back 方法三:Bit Manipulation https://leetcode.com/problems/subsets/discuss/
阅读全文
摘要:拓扑排序的题目,如果b的前置课程是a,则 a->b。首先计算每个节点的入度,入度为0的结点放到队列中,类似BFS。如果最后有结点的度不为0,说明不行(有环存在)。
阅读全文
摘要:方法一:利用两个栈,每次push都利用另一个栈倒一遍。其中push O(n) 方法二:同样是利用两个栈,但是不同于上一种方法每次push都要倒一次。两个栈记作in和out,out顺序与queue一致。每次push都放到in中,需要pop的时候才把in倒到out中执行。相当于in作为一个缓存,out没
阅读全文
摘要:递归非常好写,这里主要记录非递归的写法。 Preorder 方法一:直接利用栈来写。 方法二:先左子树一路访问下去,全部访问完毕回溯并访问右边。p = s.top() 代表 p 的左子树已经全部访问完毕,p=s.top() 回到 p 结点,接着访问右子树。 除了这种 if else 写法,while
阅读全文
摘要:暴力的话,判断n是否是prime的时候只要循环到根号n,会超时。 另一种解法利用 埃拉托斯特尼筛法Sieve of Eratosthenes ,可以详见 http://www.cnblogs.com/grandyang/p/4462810.html 中的图。
阅读全文
摘要:二分题,第一遍写起来还是有点问题,记录一下解题思路。 二分一: 开根号,也就是找到 区间为1的low和high,那么low就是答案,因此 while (low+1<high) 来保证区间为1。 维护区间 [low, high], 但是我第一次做的时候,更新high是 high=mid-1,最后返回的
阅读全文
摘要:方法一:迭代 方法二:递归 25. Reverse Nodes in k-Group 递归非常好写,需要一个reverse函数,和翻转单链表写法类似,顺便复习。当然也可以迭代写,比较麻烦。
阅读全文

浙公网安备 33010602011771号