算法汇总,包含常见的经典算法以及对应的模板和各种ojs和力扣上的解题代码
记录了笔试中常见的算法以及对应的模板题,见文件夹docs下;
BinaryIndexedTree.md // 树状数组
ConvexHullProblem.md // 凸包问题
Differential.md // 差分算法
DigitalDynamicProgram.md // 数位DP
ExceptedDynamicProgram.md // 期望DP
GameTheory.md // 博弈论
MathTheory.md // 数学理论
SegmentTree.md // 线段树
SeqDynamicProgram.md // 序列DP
template.md // 经典算法模板
TreeDynamicProgram.md // 树形DP
UnioFind.md // 并查集
学习完后,应对大部分公司笔试都没太大问题。
极少部分记录,完整记录见 力扣.xls文件;
| 题目 | 对应标签 | 标注 |
|---|---|---|
| P1(两数之和) | 数组、哈希表 | |
| P2(两数相加) | 递归、链表、数学 | |
| P3(无重复字符的最长子串) | 哈希表、字符串、滑动窗口 | |
| P4(寻找两个正序数组的中位数) | 数组、二分查找、分治 | * |
| P5(最长回文字串) | 字符串、动态规划 | * |
| P6(Z字形变换) | 字符串 | |
| P7(整数反转) | 数学 | |
| P8(字符串转换整数(atoi)) | 字符串 | |
| P9(回文数) | 数学 | |
| P10(正则表达式匹配) | 递归、字符串、动态规划 | ** |
| P11(盛水最多的容器) | 贪心、数组、双指针 (随着第一个元素的递增,第二个元素是递减的,那么就可以使用双指针的方法) |
|
| P12(整数转罗马数字) | 哈希表、数学、字符串 | |
| P13(罗马数字转整数) | 哈希表、数学、字符串 | |
| P14(最长公共前缀) | 字符串 | |
| P15(三数之和) | 排序、数组、双指针、去重 (排序,使用 if (i == begin or nums[i] != nums[i - 1])) |
|
| P16(最接近的三数之和) | 排序、数组、双指针、去重 | |
| P17(电话号码的数字组合) | 哈希表、字符串、回溯 | * |
| P18(四数之和) | 排序、数组、双指针、去重 | |
| P19(删除链表的倒数第 N 个结点) | 链表、双指针 | |
| P20(有效的括号) | 字符串、栈 | |
| P21(合并两个有序链表) | 链表、递归 | |
| P22(括号生成) | 字符串、动态规划、回溯 | * |
| P23(合并K个升序链表) | 链表、分治、归并(排序)、优先队列 | * |
| P24(两两交换链表中的节点) | 链表、递归 | |
| P25(K 个一组翻转链表) | 链表、递归 | |
| P26(删除有序数组中的重复项) | 数组、双指针 | * |
| P27(移除元素) | 数组、双指针 | |
| P28(实现 strStr()) | 双指针、字符串匹配 | |
| P29(两数相除) | 位运算、数学 | |
| P30(串联所有单词的子串) | 字符串、哈希表、滑动窗口 | ** |
| P31(下一个排列) | 数组、双指针 | ** |
| P32(最长有效括号) | 字符串、栈、动态规划 (取最值一般是通过坐标索引来相减得到,类似于P3、P5) |
** |
| P33(搜索旋转排序数组) | 数组、二分查找 | * |
| P34(在排序数组中查找元素的第一个和最后一个位置) | 数组、二分查找 | * |
| P35( 搜索插入位置) | 数组、二分查找 | |
| P35( 搜索插入位置) | 数组、二分查找 | |
| P36( 有效的数独) | 数组、矩阵、哈希表 | |
| P37( 解数独) | 数组、矩阵、回溯 | * |
| P38( 外观数列) | 字符串、递归 | |
| P39( 组合总和) | 数组、回溯 | * |
| P40( 组合总和Ⅱ) | 数组、回溯、去重 | * |
| P41( 缺失的第一个正数) | 数组、哈希表、置换 | * |
| P42( 接雨水) | 数组、双指针、动态规划、单调栈 | * |
| P43(字符串相乘) | 字符串、数学 | |
| P44(通配符匹配) | 字符串、贪心、动态规划 | |
| P45(跳跃游戏 II) | 数组、贪心、动态规划 | * |
| P46(全排列) | 数组、回溯 | |
| P47(全排列 II) | 数组、回溯、去重 | |
| P48(旋转图像) | 数组、数学、矩阵 | |
| P49(字母异位词分组) | 字符串、哈希表、排序 | |
| P50(Pow(x, n)) | 递归、数学、快速乘法 | * |
| P51(N皇后) | 回溯 | |
| P52(N皇后 II) | 回溯 | |
| P53(最大子序和) | 数组、分治、动态规划 | * |
| P54(螺旋矩阵) | 数组、矩阵、模拟 | 字节 |
| P55(跳跃游戏) | 数组、贪心、动态规划 | |
| P56(合并区间) | 数组、排序 | 字节 |
| P57(插入区间) | 数组 | |
| P58(最后一个单词的长度) | 字符串 | |
| P59(螺旋矩阵 II) | 数组、矩阵、模拟 | |
| P60(排列序列) | 递归、数学 | ** |
| P61(旋转链表) | 链表、双指针 | |
| P62(不同路径) | 数学、组合数学、动态规划 | |
| P63(不同路径 II) | 数组、矩阵、动态规划 | |
| P64(最小路径和) | 数组、矩阵、动态规划 | |
| P65(有效数字) | 字符串 | * |
| P66(加一) | 数组、数学 | |
| P67(二进制求和) | 数学、字符串、模拟、位运算、从后往前 | |
| P68(文本左右对齐) | 字符串、模拟 | |
| P69(x 的平方根) | 数学、二分查找 | |
| P70(爬楼梯) | 数学、动态规划 | 字节(改) |
| P71(简化路径) | 字符串、栈 | |
| P72(编辑距离) | 字符串、动态规划 | 字节* |
| P73(矩阵置零) | 数组、哈希表、矩阵 | |
| P74(搜索二维矩阵) | 数组、矩阵、二分查找 | |
| P75(颜色分类) | 数组、排序、双指针 | |
| P76(最小覆盖子串) | 哈希表、字符串、滑动窗口 | * |
| P77(组合) | 数组、回溯 | |
| P78(子集) | 位运算、数组、回溯 | |
| P79(单词搜索) | 数组、回溯、矩阵 | 小米 |
| P80(删除有序数组中的重复项 II) | 数组、双指针 | |
| P81(搜索旋转排序数组 II) | 数组、二分查找 | |
| P82(删除排序链表中的重复元素 II) | 链表、双指针 | |
| P83(删除排序链表中的重复元素) | 链表 | |
| P84(柱状图中最大的矩形) | 数组、单调栈 | * |
| P85(最大矩形) | 数组、矩阵、动态规划、单调栈 | * |
| P86(分隔链表) | 链表、双指针 | |
| P87(扰乱字符串) | 字符串、动态规划 | 拼多多** |
| P88(合并两个有序数组) | 数组、排序、双指针 | |
| P89(格雷编码) | 数学、回溯、位运算 | * |
| P90(子集 II) | 位运算、数组、回溯 | |
| P91(解码方法) | 字符串、动态规划 | * |
| P92(反转链表 II) | 链表 | 百度、美团* |
| P93(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P94(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P95(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P96(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P97(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P98(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P99(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P100(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P101(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P103(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P103(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P104(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| P105(复原 IP 地址) | 字符串、回溯 | 字节、虾皮* |
| ... | ... | |
| P206(反转链表) | 链表 | |
| ... | ... | |
| P977(有序数组的平方) | 数组、排序 | |
| ... | ... | |
| P1137(第 N 个泰波那契数) | 数学、记忆搜索、动态规划 |