首先申明. 可以跟着我的题号走. 但是我下面这个文档题目并不全,只是前期加上去的, 前期节奏慢可以做这些, 后期懒得加上去了. 我做的题目都是经典题目, 基本都包含吧.
可以浏览一下目录, 点进去感兴趣的 , 看看我的个人理解吧. 我觉得我理解的比较简单, 也挺容易懂的. 别把算法定义的太高级的概念吓跑了. 其实学习算法对于编程的提升很大的.
其次推荐一下 , 极客时间的算法40讲, 带你了解算法, 课程应该正常人可以一周到一个月完成, 看你的算法底子.
1. LeetCode - 2 两数相加
2. LeetCode - 19 删除链表的倒数第N个节点
3. LeetCode - 92 反转链表 II
其实链表吧 . 比较难的就是单链表操作. 双链表的话,一般不考. 单链表的N个旋转.
206 代码
链表全局反转,
链表局部反转
链表判断是否有无环. loop / circle
其实核心就是遍历. 理解DFS和BFS . (递归+非递归)
进阶篇 , 就是理解了 DFS后, 进行的一些学习吧. 核心是DFS**这块.
高级篇 , 就是树的变种, 可能是 BSF , B+ ,红黑. 基本就是这操作吧.
**当你真正掌握了树的操作和**. 递归代码解决问题 对你来说太简单了, **
括号问题, 匹配括号 , num20 .
灵活使用队列和栈.
二叉堆. 就是我们最简单的那种实现. 依靠数组实现的. 但是再次插入一个元素时, 就是heapfiy时 就会出现问题. 效率低.
这是维基百科打的Heap中告诉的几种方式.
Operation | find-min | delete-min | insert | decrease-key | meld |
---|---|---|---|---|---|
Binary[8] | Θ(1) | Θ(log n) | O(log n) | O(log n) | Θ(n) |
Leftist | Θ(1) | Θ(log n) | Θ(log n) | O(log n) | Θ(log n) |
Binomial[8][9] | Θ(1) | Θ(log n) | Θ(1)[b] | Θ(log n) | O(log n)[c] |
Fibonacci[8][10] | Θ(1) | O(log n)[b] | Θ(1) | Θ(1)[b] | Θ(1) |
Pairing[11] | Θ(1) | O(log n)[b] | Θ(1) | o(log n)[b][d] | Θ(1) |
Brodal[14][e] | Θ(1) | O(log n) | Θ(1) | Θ(1) | Θ(1) |
Rank-pairing[16] | Θ(1) | O(log n)[b] | Θ(1) | Θ(1)[b] | Θ(1) |
Strict Fibonacci[17] | Θ(1) | O(log n) | Θ(1) | Θ(1) | Θ(1) |
2-3 heap[18] | O(log n) | O(log n)[b] | O(log n)[b] | Θ(1) | ? |
效率最高的是 严格的斐波那契堆.
中位值都很难啊
1. LeetCode - 4 寻找两个有序数组的中位数
其实字符串类似于数组, 把他想成数组就行了 回文字符串就有一点复杂
1. LeetCode - 3 无重复字符的最长子串
2. LeetCode - 5 最长回文子串
大多数数组问题,如果是基于子序列问题, 我们可以用滑动窗口算法
1. LeetCode - 1 两数之和
2. LeetCode - 152 乘积最大子序列
2. LeetCode - 53 最大子序和
1. LeetCode - 168 Excel表列名称
1. LeetCode - 1195 交替打印字符串
1. LeetCode - 46 全排序
1. 排序算法
其实就是DFS**. 深度遍历. 其实也好想. 比如深度遍历, 特别适合 层级操作. 都做的是一样的事情. 比如我们树的遍历. 每一层其实都是一样的做法.这种适合用 递归.
1. 递归**
其实就是 logN的秘诀. 二分特别适合查找 , 找到符合的最小单元. 而二分最后分到什么程度可以我们自己控制. 一般就是分到最小. 也就是 4个数字的数组话, 切2次. 就行了. 也就是 log4 .
一般说到 " 有序数组 ", 第一个想到的就是二分的**, 切记 , 这个是必须知道的.
所以二分的**也很重要. 这么说其实类似于 分治的**. 但是二分一般是分治 . 但是他不包含归并过程.
分治 / 归并. 比如求Math.pow() . 就是一个分治/归并**. 子情况都是一样的 . 然后归并过程自己实现. 还有就是我们的归并排序.
动态规划** , 其实就是动态递推,找规律就好了.. 主要是解决了重复使用的问题 , 比如说. 斐波那契数组. 我们如果使用递归写法的话, 那么需要重复计算很多项, 那么如何优化呢, 就是DP的**了 .
DP 的流程一般是 , 大佬级别是逆推的过程. 因为DP, 需要知道终点.
DP 主要是推那个DP表达式. 就是 F(N)=F(N+1)+F(N+2) 类似于这个
还有就是正常逻辑一般是从开始往结果推. 但是DP一般是倒着推.
具体可以看看 , leetcode 的 64题. 就是一个DP的**. 其实一般人会想到DFS.
这里可能还有贪心算法之类de. 可以去lc找.
主要是泛举的**. 比如 1,2,3,4
排列组合问题 . 或者 树型结构**吧.
其实比DFS多了, 一个记忆化的**. 懂了吧. 他会保存这个阶段的状态. 比如这个阶段结束的时候, 要重置当前阶段的状态.
主要常见的算法 就是, N皇后的问题 和 一个 子串排列组合的问题吧. 其实怎么说. 还好.
反正 我这个lc练习的题目吧. 并没有全部展示出来. 我个人习惯不好. 主要是有些题目, 后面写了. 其实发现很简单的. 解题过程和这个都懒得总结了
如果想练习的话. 可以跟着我 的练习题目走. 基本都是常见的题. 高频题目吧 . 反正就是这个了.
num+(leetcode题号) , 每一个目录都是. 可以跟着练习.