算法汇总,包含常见的经典算法以及对应的模板和各种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 个泰波那契数) | 数学、记忆搜索、动态规划 |