随笔分类 - LeetCode
摘要: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函数,和翻转单链表写法类似,顺便复习。当然也可以迭代写,比较麻烦。
阅读全文
摘要:解法一:DP 遇到不会的题目,先想想暴力怎么做。对于每个元素,如果用暴力做的话,分别向左向右找最大的值,那么当前元素能装的水为 min(leftmax,rightmax)-a[i]。 leftmax和rightmax都可以记录下来。以leftmax为例,leftmax[i] = max(leftma
阅读全文
摘要:类似需要枚举所有解的题目,都是典型的dfs的题目。 本题要求答案里不能有重复的解,因此先将数组排序,dfs里增加一个start参数,来表明开始的下标,防止重复发生。仔细体会一下!
阅读全文
摘要:解法一: 类似 LeetCode 442. Find All Duplicates in an Array,由于元素是1~n,因此每个元素的值-1(映射到0~n-1)就可以直接当做下标。 解法二:Floyd Cycle Detection 由于元素都是1~n,而数组n+1个元素,因此下标为0~n,可
阅读全文

浙公网安备 33010602011771号