/leetcode

我学习LeetCode的题目和分析都在这里 , 我也希望给大家面试提供经验之谈

Primary LanguageJava

LeetCode 解题之路

​ 首先申明. 可以跟着我的题号走. 但是我下面这个文档题目并不全,只是前期加上去的, 前期节奏慢可以做这些, 后期懒得加上去了. 我做的题目都是经典题目, 基本都包含吧.

​ 可以浏览一下目录, 点进去感兴趣的 , 看看我的个人理解吧. 我觉得我理解的比较简单, 也挺容易懂的. 别把算法定义的太高级的概念吓跑了. 其实学习算法对于编程的提升很大的.

​ 其次推荐一下 , 极客时间的算法40讲, 带你了解算法, 课程应该正常人可以一周到一个月完成, 看你的算法底子.

1. 链表部分

1. LeetCode - 2 两数相加

源码位置 , 讲解

源码位置 , 讲解

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) ?

效率最高的是 严格的斐波那契堆.

2. 中位数

​ 中位值都很难啊

源码位置 , 讲解

3. 字符串

其实字符串类似于数组, 把他想成数组就行了 回文字符串就有一点复杂

源码位置 , 讲解

2. LeetCode - 5 最长回文子串

源码位置 , 讲解

4. 数组

大多数数组问题,如果是基于子序列问题, 我们可以用滑动窗口算法

1. LeetCode - 1 两数之和

源码位置 , 讲解

2. LeetCode - 152 乘积最大子序列

源码位置 , 讲解

2. LeetCode - 53 最大子序和

源码位置 , 讲解

5. 10进制转其他进制换问题 (巧)

1. LeetCode - 168 Excel表列名称

源码位置 , 讲解

5. 多线程

1. LeetCode - 1195 交替打印字符串

源码位置 , 讲解

6. 回溯法

1. LeetCode - 46 全排序

源码位置 , 讲解

7. 排序算法

源码位置 , 讲解

7. 递归** (DFS)

​ 其实就是DFS**. 深度遍历. 其实也好想. 比如深度遍历, 特别适合 层级操作. 都做的是一样的事情. 比如我们树的遍历. 每一层其实都是一样的做法.这种适合用 递归.

源码位置 , 讲解

8. 二分** 和 分治 / 归并

其实就是 logN的秘诀. 二分特别适合查找 , 找到符合的最小单元. 而二分最后分到什么程度可以我们自己控制. 一般就是分到最小. 也就是 4个数字的数组话, 切2次. 就行了. 也就是 log4 .

一般说到 " 有序数组 ", 第一个想到的就是二分的**, 切记 , 这个是必须知道的.

所以二分的**也很重要. 这么说其实类似于 分治的**. 但是二分一般是分治 . 但是他不包含归并过程.

分治 / 归并. 比如求Math.pow() . 就是一个分治/归并**. 子情况都是一样的 . 然后归并过程自己实现. 还有就是我们的归并排序.

9. DP (动态规划)**.

动态规划** , 其实就是动态递推,找规律就好了.. 主要是解决了重复使用的问题 , 比如说. 斐波那契数组. 我们如果使用递归写法的话, 那么需要重复计算很多项, 那么如何优化呢, 就是DP的**了 .

DP 的流程一般是 , 大佬级别是逆推的过程. 因为DP, 需要知道终点.

DP 主要是推那个DP表达式. 就是 F(N)=F(N+1)+F(N+2) 类似于这个

还有就是正常逻辑一般是从开始往结果推. 但是DP一般是倒着推.

具体可以看看 , leetcode 的 64题. 就是一个DP的**. 其实一般人会想到DFS.

这里可能还有贪心算法之类de. 可以去lc找.

10 . 回溯**

主要是泛举的**. 比如 1,2,3,4 排列组合问题 . 或者 树型结构**吧.

其实比DFS多了, 一个记忆化的**. 懂了吧. 他会保存这个阶段的状态. 比如这个阶段结束的时候, 要重置当前阶段的状态.

主要常见的算法 就是, N皇后的问题 和 一个 子串排列组合的问题吧. 其实怎么说. 还好.

总结

反正 我这个lc练习的题目吧. 并没有全部展示出来. 我个人习惯不好. 主要是有些题目, 后面写了. 其实发现很简单的. 解题过程和这个都懒得总结了

如果想练习的话. 可以跟着我 的练习题目走. 基本都是常见的题. 高频题目吧 . 反正就是这个了.

num+(leetcode题号) , 每一个目录都是. 可以跟着练习.