随笔分类 - LeetCode
摘要:方法一:Line Sweep 几何类问题,可以用 Line Sweep nlogn 解决。维护一个active set,左边界进右边界出。排序时注意 corner cases: 1. 右边界和左边界x一样时,先处理左边界。 2. 多个左边界x一样时,高的先处理。 3. 多个右边界x一样时,矮的先处理
阅读全文
摘要:方法一:Line Sweep naive的想法是检查面积是否相等,但可以举出overlap的反例。顺着这种思路想,如果能判断是否重叠,那么本题就解决了。 暴力检查重叠太慢了。这里采用line sweep的方法。先根据x排序,维护一个对于y interval的active set。从左向右扫描,遇到左
阅读全文
摘要:树的题递归来做。给定一个root,如果左右两颗子树height一样,那么root就是所求的解;如果不一样,那么解一定再height高的那棵子树里,递归调用即可。height和depth的区别:What is the difference between tree depth and height?
阅读全文
摘要:参见 307. Range Sum Query - Mutable Segment Tree Tree Implementation (SegmentTreeNode) https://www.youtube.com/watch?v=rYBtViWXYeI&list=PLLuMmzMTgVK7ug0
阅读全文
摘要:本题的核心是找到LCS,然后通过dp数组,反向构建出 Common Supersequence。这和 print LCS 的思路极其相似。 LCS: Longest Common Subsequence / String 总结 https://www.geeksforgeeks.org/printi
阅读全文
摘要:本题第一眼看上去很难,但是实际上并不是二维的问题,而是一个一维的数组分段的问题。 本题需要格外注意下标,很容易出错。 为了减少对第一本书的初始化,记 dp[i] 为前i本书所需的最小高度,即下标 0~i-1,初始条件为 dp[0]=0 用j表示从下标j开始放到下一个row,即 [j~i-1] 为新的
阅读全文
摘要:只能向右或者向下,典型的DP问题。本题问的是能到达右下角的最小初始生命值。 dp[i][j] 表示从 dungeon[i][j] 位置到右下角的最小初始生命值。 dp[i][j] = min(dp[i+1][j], dp[i][j+1]) - dungeon[i][j],同时要保证dp[i][j]始
阅读全文
摘要:一看就是DP题,但是递推公式比较难想。为了简化问题,给 nums 开始和最后都加上1。 记 dp[i][j] 表示 nums[i~j] 能得到的最大coin。 k 表示保留着的气球, dp[i][j] = max_k { dp[i][k-1] + nums[i-1] * nums[k] * nums
阅读全文
摘要:表达式相关的题目,由于会出现各种嵌套,通常用递归来做。 递归来做主要由两种,如 op e1 e2 1. 通过括号或者空格找到 e1, e2 的范围,递归求解 e1, e2。 2. 直接递归求解,在递归内找 e 的范围。 由于本题比较复杂,很难直接把嵌套的表达式找出来,因此采用第二种方法,在递归中处理
阅读全文
摘要:Greedy 先生成abbreviation,如果有重复,对所有重复的prefix再添加一个字符,直到没有重复为止。 记dict长度为n,每个word平均长度为m。 外侧for循环O(n),while循环最多O(m), 内侧:j的for循环O(n) + k的for循环最多也是O(n) * abbre
阅读全文
摘要:792. Number of Matching Subsequences Inverted Index + Binary Search Brute Force 会 TLE,时间复杂度为 O(S*n + Σwords[i])。 可以对S中每个字符建立一个vector,保存其下标位置。这样就可以通过二分
阅读全文
摘要:字符串的题目,套路不是动态规划就是转化为图。 本题把每个string作为节点,s1 -> s2 边的权值为 把s2接到s1后还需要添加的字符数量。本题就转化为类似 TSP 的问题,TSP 可以用动归来做。 复习一下TSP: 本题思路和 TSP 思路一致。dp 初始条件设置为 C({i},i) = A
阅读全文
摘要:My Calendar I hash table + binary search,注意边界情况即可。 My Calendar II 方法一:沿用 My Calendar I 的思路,给overlap的时间段再建一个hashtable,判断overlap的时间有没有overlap。 https://l
阅读全文
摘要:方法一:Sort By Column 先Group by column,并排序。对于每个col,枚举所有的(r1, r2) pair,把pair作为key,col作为value保存到map,即 map[{r1,r2}] = col。如果之后再遍历到同样的pair,说明可以形成一个长方形。 需要注意的
阅读全文
摘要:所有可能的密码总数 k^n,如果把这些密码都拼起来,长度 n*k^n 如果每个密码与前一个密码共用 n-1 位,那么长度缩减为 k^n + (n-1) 上述字符串也被称为 De Bruijn sequence。 所以问题转变为,如果得到这个序列。很容易想到转化为图的问题来做,而且可以转化不同的问题。
阅读全文
摘要:方法一:DFS+Memoization 某种程度来说本题和 Word Break 很像。直接dfs暴力做肯定会超时,加上memoization即可。 dfs(start, m, ...) 表示从index start开始,分成m组的minmax值。 时间复杂度 比较复杂,应该和DP一样是 O(n^2
阅读全文
摘要:这道题本质就是 323. Number of Connected Components in an Undirected Graph。 DFS O(n^2) 一模一样, 只不过图要自己构建而已。 Union Find O(n^2),两两union n^2 Union Find (Optimized)
阅读全文
摘要:由于是CBT,这道题一定是要用到CBT的性质,来减少时间复杂度。 由于是树的题,很容易想到递归,将原问题划归到子树上。完全二叉树除了最后一层一定是满的,因此子树中一定有一棵是满二叉树,而满二叉树的节点个数是2^n-1,接着只要计算另一棵的节点数即可。 在完全二叉树中,计算树的高度只要一路向左查看即可
阅读全文
摘要:对于每一个位置,无论是odd还是even jump,jump后的位置要么不存在,要么就是符合要求的唯一位置。因此最关键的问题是解决: 给定一个index i,找出jump后的位置 如果对每个index都能找到jump后的位置,那么利用递归 (DP) 很容易就能判断能否jump到最后一个位置。 由于数
阅读全文
摘要:在wordlist里随机选择一个word,调用master.match,得到匹配的个数。 假设返回值为2,那么在wordlist里,只有那些和word匹配数为2的才可能是最终的答案,可以去掉很多情况。 最优的策略是不是随机选择,这道题测试用例比较简单,随机也是能AC的。 我们的目标是尽可能减少下一次
阅读全文

浙公网安备 33010602011771号