随笔分类 -  LeetCode

摘要:实质就是求每个节点的最大深度。用一个hash表记录,最后输出。 其实可以不用hash表,每次深度比vector.size()大的时候新建一个vector,这样节省了空间。 类似的方法在别的题里也有应用。 时间复杂度 O(n) 空间复杂度 O(n) 阅读全文
posted @ 2018-09-04 11:56 約束の空 阅读(118) 评论(0) 推荐(0)
摘要:BFS的题目,一开始做的时候,我是判断出栈元素和数组里的元素是否距离为1,超时。思考了一下觉得是判断是否距离为1处,所有换过一个字母的字符串都要和每个wordList里元素比较,太耗时了。 所以直接建立一个set,所有换过一个字母的字符串直接在set里找,找到了就直接erase,方便不少。 Word 阅读全文
posted @ 2018-09-04 01:38 約束の空 阅读(213) 评论(0) 推荐(0)
摘要:找中序遍历的后一个节点,那就中序遍历到当前节点后再往后一个,可以用递归,也可以非递归,完全没有用到BST的性质。 也可以充分利用BST的性质,如果p比当前节点小,说明在左子树,res=root;否则去右子树搜索。 用递归写 引申一下,如果求前面一个节点,也是一样做,只不过left right反一反。 阅读全文
posted @ 2018-09-01 01:52 約束の空 阅读(327) 评论(0) 推荐(0)
摘要:300. Longest Increasing Subsequence brute force做的话,递归来做,每个元素在不在subsequence中,时间复杂度O(2^n) 方法一:DP 由于只需要求个数,不需要把subsequence求出来,很自然想到dp dp[i] 表示以 a[i] 为结尾的 阅读全文
posted @ 2018-08-31 05:14 約束の空 阅读(165) 评论(0) 推荐(0)
摘要:排序题的变种,对于a和b,如果a+b>b+a,那么a排在b前面。 复习一下 sort 函数,如果cmp写在里面的写法:[](int a, int b){return a>b;} 阅读全文
posted @ 2018-08-31 04:50 約束の空 阅读(85) 评论(0) 推荐(0)
摘要:方法一:Divide and Conquer 数组第一个一定是根,第一个大于根的一定是右子树的根,因此我们可以把 根,左右子树都区分开来。判断根是否在合理范围内,如果在,在分别判断左右子树。思路清晰,也很容易写。 Time: O(nlogn) 方法二:Stack 维护一个单调递减的栈。如果当前元素比 阅读全文
posted @ 2018-08-31 03:25 約束の空 阅读(124) 评论(0) 推荐(0)
摘要:方法一: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 阅读全文
posted @ 2018-08-31 02:06 約束の空 阅读(165) 评论(0) 推荐(0)
摘要:格雷码,大学电路与电子学没好好上,哎。 最容易理解的方法是 镜面生成, 把原数组反过来最高位补1即可。 阅读全文
posted @ 2018-08-30 11:59 約束の空 阅读(95) 评论(0) 推荐(0)
摘要:116. Populating Next Right Pointers in Each Node 直接做的话用levelOrder做即可,但是要求空间复杂度O(1),所以不行。 Recursive 这里递归是preOrder,一定要先将root的左右儿子连接起来,后面递归才能继续连接。 这里每次df 阅读全文
posted @ 2018-08-30 07:35 約束の空 阅读(98) 评论(0) 推荐(0)
摘要:Boomerang 回旋镖的意思,本题意思是寻找 abc的点对,使得ab,ac距离相等。 一个循环固定a,计算其余的点到a的距离,简历一个hashtable,保存对应距离的点的个数。 如果有n个点到a距离相等,那么一共有 P_n^2 种可能 (题目中提到不同顺序算多种) 149. Max Point 阅读全文
posted @ 2018-08-30 02:12 約束の空 阅读(128) 评论(0) 推荐(0)
摘要:方法一:Inorder Traversal Binary Search Tree 的一个性质就是 inorder 遍历的时候是有序的。 这道题和 426. Convert Binary Search Tree to Sort Doubly Linked List 类似,需要一个 prev 指针记录前 阅读全文
posted @ 2018-08-29 23:57 約束の空 阅读(108) 评论(0) 推荐(0)
摘要:利用matrix的第一行和第一列来记录,第二遍扫描时再根据记录的信息把matrix的元素置0。 阅读全文
posted @ 2018-08-29 22:36 約束の空 阅读(109) 评论(0) 推荐(0)
摘要:如果把矩阵元素看做点,小的元素到打的元素看做边连起来,这道题等价于在一个有向图中寻找最长路径。 第一想法是用dfs或bfs,但是直接做超时了。以dfs为例,时间复杂度为O(2^(m+n)),空间复杂度O(h)=O(mn) 由于dfs中很多节点的最长路径都被重复计算了,因此可以 Memorizatio 阅读全文
posted @ 2018-08-29 06:52 約束の空 阅读(271) 评论(0) 推荐(0)
摘要:15. 3Sum Two Sum 的 follow up Two Sum 使用hashtable做到O(n)时间复杂度 所以看到这道题,第一想法是固定一个元素,剩下的用 Two Sum 处理。但是由于这道题有重复元素存在,最后去重会TLE,因此不能这样做。 在一个有序数组里寻找加和为给定值的两个元素 阅读全文
posted @ 2018-08-29 05:40 約束の空 阅读(99) 评论(0) 推荐(0)
摘要:isdigit(), isalpha(), isalnum() 用来判断是否是数字,是否是字母,是否是数字+字母 toupper(), tolower() 对char大小写切换 阅读全文
posted @ 2018-08-28 22:18 約束の空 阅读(110) 评论(0) 推荐(0)
摘要:这道题本质上和 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 " 阅读全文
posted @ 2018-08-28 08:14 約束の空 阅读(150) 评论(0) 推荐(0)
摘要: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 阅读全文
posted @ 2018-08-28 03:21 約束の空 阅读(126) 评论(0) 推荐(0)
摘要:Facebook full-time 的面试题。 遇到这种数字的题,第一感觉就是递归。而且一定要问清楚数字给定的范围,会不会是负数,有没有范围等等。题目给定了范围 0~2^31-1,因此最高到 billion。 根据大小来拆分然后递归,注意一些corner cases,1~19,20,30,…… 总 阅读全文
posted @ 2018-08-27 09:31 約束の空 阅读(183) 评论(0) 推荐(0)
摘要:当前height下, 分别表示 a[i][j] 向左和向右能扩展的位置下标(右下标要+1,这样右-左刚好是矩形的宽) 阅读全文
posted @ 2018-08-27 08:38 約束の空 阅读(98) 评论(0) 推荐(0)
摘要:这道题是 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 阅读全文
posted @ 2018-08-26 22:09 約束の空 阅读(82) 评论(0) 推荐(0)