
算法
Mr.zhao's-blog
这个作者很懒,什么都没留下…
展开
-
最长公共子序列问题,证明及优化后代码(证明主要摘自《算法导论》)
一、证明 看了leetcode上很多相关的题解,主要思路都是动态规划(dp),但都没有给出所用递推公式的数学证明,我一直没能理解为什么那么做能求出正确的答案,为此查了手头上能找到的大部分相关的算法资料,最后终于在算法导论是找到了相关的数学证明。首先是对递推公式的证明,如下: 注:(文中图片都截取自《算法导论》第三版) 其中Xi是序列X的从0到i的前缀,定义如下: 对于定理15.1中(2):因为Z是X和Y的LCS,所以Z中每个字母都同时在X和Y中,且顺序不变。 如果Zk!== Xm,且Zk在X中一原创 2020-12-15 16:21:58 · 1277 阅读 · 2 评论 -
几种常见排序算法的实现及运行时间对比
// 冒泡排序 function popSort(arr) { if (arr.length < 2) return arr; let n = arr.length; while (n > 1) { let exchanged = false; for (let i = 0; i < n - 1; i++) { if (arr[i] > arr[i + 1]) { exc.原创 2020-12-09 00:53:25 · 1279 阅读 · 0 评论 -
解算法题的一些基本技巧
### 解题的流程 1. 理解题意 2. 思考所有可能的解法,以及对应的时间空间复杂度 3. 选择想到的最优解法编写代码 4. 写测试用例 ### 写代码的流程 1. 想清楚代码的初始状态,递推公式/遍历要执行的操作,终止条件 2. 编写初始化,循环遍历代码 3. 处理边界值 4. 返回结果 ### 常用的一些思想 0. 使用哈希表降低各种查找,存在判断的时间消耗(空间换时间) 1. 升维,例如跳表或cpu缓存的设计 (空间换时间) 2. 递归(分治),尽量使用迭代来替换递归 3. 双指针 4. 快慢指原创 2020-12-07 22:20:30 · 328 阅读 · 2 评论