业务开发算法 50 讲
https://time.geekbang.org/column/intro/100100901?utm_campaign=geektime_search&utm_content=geektime_search&utm_medium=geektime_search&utm_source=geektime_search&utm_term=geektime_search&tab=catalog
有一些超级难的算法比如遗传算法,蚁群算法,看了数学建模国赛感觉好难写,那些人怎么写出来的? - 幼鹰 me 的回答 - 知乎
https://www.zhihu.com/question/345429819/answer/887625579
[LeetCode](LeetCode.md)
[排序](排序.md)
| 主题 | 子主题 | 具体内容 | 相关题目 | 备注 |
| --------- | --------- | ------ | ------------------------- | ---------------------------------------------------------------------------------------------------------- |
| 数组 | 一维 | 数组理论基础 | | |
| | | | 有多少小于当前数字的数字 | |
| | | | 3. 移除元素 | |
| | | | 4. 有序数组的平方 | |
| | | | 5. 长度最小的子数组 | |
| | | |【网易】电影院选座 | |
| | 摩尔投票法 | | 169. 多数元素 | JZ39 数组中出现次数超过一半的数字 |
| | | | | 摩尔投票法对拼消耗 |
| | for因子动态变化 | | 6. 螺旋矩阵II | JZ29 顺时针打印矩阵 |
| | | | | 模拟过程(四边界 或 偏移量)|
| | | | 7. 跳跃游戏 | 一格一更 |
| | | | 8. 跳跃游戏II | 一步一更 |
| | 前缀和 | | 剑指 Offer II 071. 按权重生成随机数 | 随机数 random.nextInt(n)[0,n) newDouble[0, 1.0) |
| | | | 525. 连续数组 | |
| | | | 剑指 Offer II 013. 二维子矩阵的和 | |
| | | | lc303 | |
| | | | lc304 | |
| | 二维 | | 17. 用最少数量的箭引爆气球 | Integer.compare(o1[0],o2[0]),直接极小和极大作差会造成整型溢出 |
| | | | 18. 无重叠区间 | Float.compare(a,b) |
| | | | 20. 合并区间 | 二维数组排序,也是自定义比较器 |
| | | | 19. 划分字母区间 | flag + 数组型哈希 |
| | | | 7. 总结篇 | |
| 字符串 | | | 1. 反转字符串 | |
| | | | JZ58 左旋转字符串 | str.substring() |
| | | | 2. 反转字符串II | |
| | | | 3. 替换空格 | |
| | | |【百度】for循环的嵌套层数 | 把一大段文本,逐行扫描,append成一个长字符串 |
| | 考虑多情况处理流程 | | JZ67 把字符串转换成整数(atoi) | lc8. 字符串转换整数 (atoi) |
| | | | | 011111111(+127) 11111111(-127) 00000000(0) 10000000 (-128) |
| | kmp | | 6. 实现strStr()) | |
| | | | 7. 重复的子字符串 | |
| | | | 43. 字符串相乘 | int y = j >= 0? num2.charAt(j) - '0': 0; |
| | | | 8. 总结篇 | |
| 链表 | | | 1. 链表理论基础 | |
| | | | JZ18 删除链表的节点 | dummy = new ListNode(-1) |
| | | | BM11 链表相加(二)| 2. 两数相加 |
| | | | 2. 移除链表元素 | |
| | | | 3. 设计链表 | |
| | | | 4. 翻转链表 | dummyNode |
| | | | 5. 两两交换链表中的节点 | 按顺序连线 |
| | | | JZ76 删除链表中重复的结点 | 82. 删除排序链表中的重复元素 II |
| | | | | cur.next!= null前面一定要有cur!= null |
| | | | JZ6 从尾到头打印链表 | |
| | | | 14. 根据身高重建队列 | 链表定点添加 |
| | | | 9. 总结篇 | |
| 集合 | | |【美团】字母数 | |
| 有序集合 | | |【美团】集合问题 | |
| 哈希表 | | | 1. 哈希表理论基础 | |
| | | | JZ35 复杂链表的复制 | 需要储存映射关系以备使用的时候就用哈希表 |
| | 数组即可胜任 | |【5.1】修改大小写 | |
| | | | JZ50 第一个只出现一次的字符 | ref.keySet().contains(x) |
| | | | 2. 有效的字母异位词 | |
| | | | 3. 两个数组的交集 | |
| | | | 4. 快乐数 | 取数值各个位上的单数操作 |
| | | | 6. 四数相加II | 分为两组两数之和 |
| | | | 7. 赎金信 | |
| | 用哈希 | | 5. 两数之和 | JZ57 和为S的两个数字 |
| | | | | 边放边搜,ref.containsKey(array[i]) |
| | 不用哈希,用指针 | | 8. 三数之和 | 两个去重点 |
| | | | 9. 四数之和 | |
| 有序哈希表 | | | | TreeMap按照key的大小,LinkedHashMap按照key加入的时间 |
| 哈希+双向链表 | | | 146. LRU 缓存 | |
| 双哈希 | | | 460. LFU 缓存 | 排行榜的场景,重写compareTo、equals、hachcode。ts默认是从左到右升序 |
| 栈与队列 | | | 2. 用栈实现队列 | |
| | | | 3. 用队列实现栈 | |
| | | | JZ31 栈的压入、弹出序列 | |
| | | | 4. 有效的括号 | |
| | | | lc32. 最长有效括号 | 栈中存下标 先标记再统计 |
| | | | 71. 简化路径 | 根目录退无可退,deque出口均在前first,split会出现""元素 |
| | | |【腾讯】压缩算法 | 转义字符 |
| | | | 5. 删除字符串中的所有相邻重复项 | |
| | | | 155. 最小栈 | 随时序变化的每一刻都记录,才能倒退回去 |
| | | | 3. 二叉树的迭代遍历 | 迭代法 - 自己压栈弹栈 |
| | | | 6. 逆波兰表达式求值 | |
| 单调队列/滑动窗口 | | | 7. 滑动窗口最大值 | JZ59 滑动窗口的最大值 |
| | | | | 普通队列实现滑动,单调性维护窗口内秩序 |
| | | |【美团6.1】小团的装饰物2 | |
| 单调栈 | | | 1. 每日温度 | 数组初始化默认值都为0,可以利用哦!|
| | | | 2. 下一个更大元素I | |
| | | | 3. 下一个更大元素II | |
| | | | JZ30 包含min函数的栈 | 两个Integer比较要用equals,它不会自动拆箱 |
| | | | 4. 接雨水 | |
| | | | 5. 柱状图中最大的矩形 | |
| | | |【腾讯】逛街 | 反向遍历 |
| 堆(优先队列)| 大根堆 | | 面试题 17.14. 最小K个数 | |
| | | |【美团】晋级人数 | |
| | | |【美团】搭配出售 | 多维度考量的时候转为贪心思想,动态最大的情况用堆处理 |
| | 小根堆 | | 8. 前K个高频元素 | o1-o2是小根堆 |
| | | |【美团10.3】公司食堂 | |
| | | | JZ41 数据流中的中位数 | 比较器、lambda表达式 |
| 二叉树 | | | 35. 二叉树总结篇 | |
| | BFS | | 5. 二叉树的层序遍历 | JZ32 从上往下打印二叉树 |
| | | | | 循环队列的思想 |
| | | |【京东】紧急疏散 | |
| | | | 17. 找树左下角的值 | |
| | | | JZ77 按之字形顺序打印二叉树 | JZ78 把二叉树打印成多行 |
| | | | | Collections.reverse() |
| | | | JZ37 序列化二叉树 | |
| | preOrder | | 前序 | 2. 二叉树的递归遍历 |
| | | | | 递归法 - java方法的栈机制 |
| | | | 6. 翻转二叉树 | JZ27 二叉树的镜像 |
| | | | 8. 对称二叉树 | 100. 相同的树 |
| | | | | 双线同时先序遍历 |
| | | | 22. 合并二叉树 | |
| | inOrder | | 中序 | |
| | | | JZ8 二叉树的下一个结点 | |
| | | | 19. 从中序与后序遍历序列构造二叉树 | 划分左右区间的递归问题,注意右区间索引的复杂性。|
| | postOrder | | 后序 | 4. 二叉树的统一迭代法 |
| | | | 9. 二叉树的最大深度 | JZ55 二叉树的深度 |
| | | | | 左右比较后传值给根 |
| | | | 10. 二叉树的最小深度 | 左右孩子都为空的节点才是叶子节点 |
| | | | 11. 完全二叉树的节点个数 | |
| | | | 12. 平衡二叉树 | JZ79 判断是不是平衡二叉树 |
| | | | 16. 左叶子之和 | |
| | | | 27. 二叉树的最近公共祖先 | JZ86 在二叉树中找到两个节点的最近公共祖先 |
| | D | | JZ26 树的子结构 | \|\|控制的遍历递归 |
| | D | | JZ13 机器人的运动范围 | 数位和,深度优先写的时候靠几个分叉控制(只写首层的广度)|
| 二叉搜索树 | | | 23. 二叉搜索树中的搜索 | |
| | | | 24. 验证二叉搜索树 | 前驱pre节点的初始化 |
| | | | 25. 二叉搜索树的最小绝对差 | |
| | | | 26. 二叉搜索树中的众数 | pre节点初始化、flag刷新思想 |
| | | | JZ33 二叉搜索树的后序遍历序列 | 不要必须落入顺序数组的俗套中,一切从基本性质出发 |
| | | | 29. 二叉搜索树的最近公共祖先 | JZ68 二叉搜索树的最近公共祖先 |
| | | | 30. 二叉搜索树中的插入操作 | |
| | | | 31. 删除二叉搜索树中的节点 | |
| | | | 32. 修剪二叉搜索树 | |
| | | | 33. 将有序数组转换为二叉搜索树 | |
| | | | 34. 把二叉搜索树转换为累加树 | |
| | | | JZ54 二叉搜索树的第k个节点 | if(root == null \|\| res!= null) return false; root为null是到底停止的条件,res不为null是完成任务的停止条件,至于返回值,只是个信息,可以用也可以不用 |
| 图 | | | | |
| | DFS | |【美团】小美的美丽树 | |
| | | | 200. 岛屿数量 | |
| | | |【ZOOM】树结点染色计算总体权重 | |
| | | |【米哈游】树的连通块 | 不要看到树就以为是二叉树,按有向图(多叉树)做 |
| | | | 797. 所有可能的路径 | |
