摘要:描述: 给定二叉树两个节点,求其最近公共祖先。最近即所有公共祖先中深度最深的。 ps:自身也算自身的祖先。 235题解决: 这是二叉搜索树,有序的,左边小右边大。 236题解决: Aha: 其实还有一些优化可以在编译期层或概率层,如第一个if中的三个或,根据树的深度和测试数量,或发生的概率进行调整,
阅读全文
摘要:描述: 实现.和*号匹配,*表示前面字符0~无穷个,.表示任意一个字符。 要求全部,匹配,不是部分匹配。 解决: 思路类似最长公共子序列, dp[i][j] = dp[i - 1][j - 1], 如果s[i] == p[j] || p[j] == '.' dp[i][j - 2], 如果p[j]
阅读全文
摘要:描述: 题目给个矩阵,每个点有个权重,左上到右下,只能往右或下走,求最小路径。 解决: dp[i][j] = min(d[i -1][j], dp[i][j - 1]) + dp[i][j] 更新一遍即可,改为一维。 注意,在原数组的基础上改不是很好,自己定义个数组存就可以了。
阅读全文
摘要:描述: 从左上角走到右下角,中间可能有若干阻碍; 题目给出一个矩阵,0表示可以走,1表示有障碍。 解决: 思路同第一题,只是如果上面或左边有障碍,自身不一定能走,注意些边界条件即可,复杂度仍是m*n。 为了防止和真正的路径1冲突,走过的障碍改为-1。
阅读全文
摘要:描述: m*n的矩阵,从左上角走到右下角,只能向下或向右走。 解决: 简单dp,dp[i][j]表示到i,j这点总共多少种路径。 dp[i][j] = dp[i][j - 1] + dp[i - 1][j],化为一维: 注意,1*1的化结果是1的,如果别的题目是0,初始化里i改为从1开始即可。 也可
阅读全文
摘要:描述: 7 1 7 3 5 9 4 8 输出4 最长递增子序列为1 3 5 9,不必连续。 解法: 三种思路: 转化为最长公共子序列(n^2),动态规划(n^2),不知叫什么解法(nlogn)。 解法一:转化 先排序nlogn,在最长公共子序列 解法二:动态规划 dp[i]定义为,以此数为终点的最长
阅读全文
摘要:描述: 给定两个字符串,求其最长公共子序列(不用连续), 输入: abc bcc programning content 输出: 2 2 解法: 动态规划。 定义dp[i][j]表示s1到i索引,以及s2到j索引为止的最长公共子序列, 则定义如下: dp[i][j] = dp[i - 1][j -
阅读全文
摘要:描述:输入,行数,之后接数据,第一行一个数据,之后每行加一。5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5思路:简单动态规划问题。dp[i][j]定义为到这个数为止(包括这个数)的最大和,则:dp[i][j] = max(d[i-1][j-1], d[i-1][j]),未考虑边界条件
阅读全文