随笔分类 - LeetCode
摘要:实质就是求每个节点的最大深度。用一个hash表记录,最后输出。 其实可以不用hash表,每次深度比vector.size()大的时候新建一个vector,这样节省了空间。 类似的方法在别的题里也有应用。 时间复杂度 O(n) 空间复杂度 O(n)
阅读全文
摘要:BFS的题目,一开始做的时候,我是判断出栈元素和数组里的元素是否距离为1,超时。思考了一下觉得是判断是否距离为1处,所有换过一个字母的字符串都要和每个wordList里元素比较,太耗时了。 所以直接建立一个set,所有换过一个字母的字符串直接在set里找,找到了就直接erase,方便不少。 Word
阅读全文
摘要:找中序遍历的后一个节点,那就中序遍历到当前节点后再往后一个,可以用递归,也可以非递归,完全没有用到BST的性质。 也可以充分利用BST的性质,如果p比当前节点小,说明在左子树,res=root;否则去右子树搜索。 用递归写 引申一下,如果求前面一个节点,也是一样做,只不过left right反一反。
阅读全文
摘要: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
阅读全文

浙公网安备 33010602011771号