07 2019 档案
摘要:Basic Calculator 由于只需要实现加减和括号,除了括号不需要考虑运算的优先级,所以可以直接one pass做。 思路是将 a-b 等价为 a+(-b),这样所有的运算都是加法,而负号只要乘以后面的数即可。 建立一个stack,遇到左括号时,压栈迄今为止的和以及括号前的符号。遇到对应右括
阅读全文
摘要:看起来是 LeetCode 221. Maximal Square 的拓展,但是完全不能用那一题dp的思想。 最主要的问题是,矩形没法和正方形一样保证 较小的边+1后形成的矩形一定是包含在其他图形中。 二维的问题我们想办法转换为一维的问题去做。类似 LeetCode 363. Max Sum of
阅读全文
摘要:方法一:DP (TLE?) brute force需要先枚举左上顶点 O(mn),右下顶点 O(mn),然后扫描面积 O(mn),总时间复杂度 O((mn)^3)。 我们可以用DP优化。利用二维prefix sum,计算出所有(0,0)到(i,j)的面积。这样对于任意一个矩形,我们可以通过大矩形减去
阅读全文
摘要:minmax的问题,通常解法是用dfs。对于本题,可以记录 [mouse,cat,turn] 来递归,根据是谁的turn决定策略。但是本题由于平局存在,而平局很难判断 (别的选择都不利,且有一种走法在recursion stack里存在,才能说明选平局),所以dfs自顶向下搜索写起来比较困难 (df
阅读全文
摘要:Backtracing + Pruning (TLE) 最容易的解法是 backtracing,但是即使加了剪枝,还是会超时。 Backtracing + Memoization 加一个memo减少递归次数。由于上面的写法的递归函数返回void,要修改为有返回值的写法才能运用memo。 让 dfs
阅读全文
摘要:Best Time to Buy and Sell Stock II Best Time to Buy and Sell Stock III 比较难想到,分别记录四个状态: 1buy,1buy1sell,2buy1sell,2buy2sell。 构建四个dp数组,例如,1buy1sell[i] =
阅读全文
摘要:需要利用 sparse 的特性来做这道题。扫描A的每一个元素 A[i][j],考虑A[i][j]会被B中哪些元素乘到。 对于A的第i行 A[i][*],会乘以B的每一列 B[*][k] ∀k,得到 res[i][k]。因此,最后 res[i][k] += A[i][j] * B[j][k]。 这样的
阅读全文
摘要:经典line sweep问题,和 perfect rectangle 很类似,但是要考虑多个矩形左边界一样的情况,加个id来区分。 和另一道类似的题 the skyline problem 不同的是,没有很多 corner cases,对 x 排序非常简单。 难点是在 active set 里,和
阅读全文
摘要:方法一: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。从左向右扫描,遇到左
阅读全文
摘要:https://www.topcoder.com/community/competitive-programming/tutorials/line-sweep-algorithms/ Computational Geometry - Line Sweep - 1 - Closest Pair (Ar
阅读全文
摘要:树的题递归来做。给定一个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,保存其下标位置。这样就可以通过二分
阅读全文

浙公网安备 33010602011771号