本文已参与「新人创作礼」活动,一起开启掘金创作之路。
leetcode中有很多算法题,这里对其前200题中的基本模式进行总结。 leetcode.cn/problemset/…
线性结构 数组或链表
排序 快排,桶排序,计数排序,插入排序,冒泡排序
二分
- 排序后二分
- 不是有序的,想办法在有序的中二分
- 只要能抛弃一半就能二分。
单指针
- 从左向右遍历
- 从右向左
- 枚举中心向两边
- 数字异或
双指针
- 滑动窗口从左向右
- 从两端向中间
- 快慢指针
- 快慢指针到终点,互换起点再继续
3指针,4指针
- first指针从0到1遍历, second, third指针从first+1, end两端向中心靠近
单调栈,单调队列
- 与滑动窗口结合
动态规划
- dp[i] = dp[i-1]
- dp[i] = dp[i-k]
- dp[i][K] i位置有k中情况
- 逆序DP
- 两两,到33,到44,到55的DP
旋转与翻转
- 旋转问题可以用翻转解决
其他
- 位运算优化
- 打表
线性结构,两个数组或链表
动态规划
- dp[i][j]与dp[i-1][j],dp[i][j-1]
- 滚动数组优化
- 原地复制
线性结构,k个数组或链表
- 归并
- 堆中放每个的表头
矩阵结构
- dp[i][j]=dp[i-1][j],dp[i][j-1],dp[i-1][j-1]
- 位运算优化
- 矩阵上二分查找,按列,按行
- 回溯+剪枝
- 按层遍历外内中
- 选中0行0列为临时存储
树
- 先根遍历
- 后根遍历
- 中根遍历
- Morris 遍历
- DFS
- BFS
- 二叉搜索树:遍历寻找一个或者多个结点,>向右,<向左
- 中序遍历考虑相邻两个元素
- 上下层遍历
- 栈辅助遍历,考虑栈与树
- 插入虚拟结点,返回时再入入值
- 利用i层计算i+1层
- 动态规划,按层
- 转树转图,一个点变多个点
- 双向广搜
- 结点数:(2^deep)-1
- 二进制编码,0左1右
图
- 问题转为图
有难度的算法
- KMP Manacher
- 状态机(DFA,NFA)
- 全排列下一个
- 牛顿迭代
- 矩阵快速幂
- 树的Morris 遍历
- 格雷码
- n &= n - 1;
- 拓扑排序
困难的题目
-
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
-
柱状图中的最大矩形。类似接雨水
-
生成n个数的格雷码
-
前序和中序遍历恢复出二叉树
-
二叉树按先序遍历展开为链表
-
发糖果
-
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
-
环形列表找出环入口
-
给你一个数组 points ,其中 points[i] = [xi, yi] 表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。
-
给定一个整数 n ,返回 n! 结果中尾随零的数量。
-
质数:埃氏筛 线性筛
-
重复的DNA序列
-
给你两个整数 left 和 right ,表示区间 [left, right] ,返回此区间内所有数字 按位与 的结果(包含 left 、right 端点)
-
快乐数
-
同构字符串
-
课程表:选课有依赖,拓扑排序