算法草稿
常用算法集合
字符处理算法
数组与查找
链表
树
算法思路 递归、动态规划、BFS/DFS、双指针、二分法搜索
数据结构的使用 哈希、栈、队列、链表 哈希表的实现
由于时间关系,后面慢慢补充代码😝
基础
普通
进阶
疑难杂症
字符处理算法
1.字符串转数字
2.字符串全排列
3.翻转字符串
4.最长无重复子串
5.最长回文子串
6.KMP算法
动态规划
1.背包问题
2.连续子数组最大和
3.实现简单正则表达式
数组
1.求两个等长、有序数组的中位数(二分法)
2.有序数组中某个数字出现的次数(二分搜索)
3.求两个不等长、有序数组的中位数
4.旋转数组求最小值、【3】旋转数组求查找某个值是否存在(二分法)
5.每行从左到右,每列从上到下递增的二维数组中,判断某个数是否存在(剑指 offer 第 3 题)
6.数组中出现次数超过一半的数字
7.第 k 大的数(拓展:最大的 k 个数)
链表
1.反转链表(使用递归和迭代两种解法,了解头插法)
2.删除链表的当前节点
3.删除倒数第 k 个节点
4.两个有序链表合并
5.复杂链表的复制
6.判断链表是否有环
7.两个链表的第一个公共节点(提示:考虑链表有环的情况)
8.删除链表中重复节点
树
1.根据中序和后序遍历结果重建二叉树
2.翻转二叉树
3.从上往下打印二叉树 (BFS 的思想)
4.判断某个数组是不是二叉树的后序遍历结果
5.二叉树中和为某个值的路径
6.二叉树中某个节点的下一个节点
7.根据中序和前序遍历结果重建二叉树
栈
1.用两个栈实现队列
2.两个队列实现栈
3.实现一个栈,可以用常数级时间找出栈中最小值
4.判断栈的压栈、弹栈序列是否合法
排序
1.归并排序 球数组中求逆序对个数
2.快速排序
3.堆排序
4.数组元素值域已知时,考虑基数排序和桶排序
位运算
1.给一个十进制数字,求它的二进制表示中,有多少个 1 (n &= n - 1)
2.给一个数组,所有数字都出现了偶数次,只有一个出现了一次,找出这个数
3.给一个数组,所有数字都出现了三次,只有一个出现了一次,找出这个数
4.给一个数组,所有数组都出现了偶数次,只有两个数字出现了一次,找出这两个数
反转链表
二分查找
二分法
冒泡排序
数据结构(链表、二叉树、算法时间复杂度、空间复杂度)
二叉搜索树
T9算法如何实现,全拼算法
最短路径算法
强连通量算法
连连看算法
求两个整数最大公约数
微信用户都是双向的好友,a是b的好友,那么b一定是a的。给定一个用户列表,有些用户是好友,有些不是,请判断,这些用户是否可以划分为两组,每组内的用 户,互相都不是好友。如果能,请给出这个划分
算法题:说 预约会议室,会有n个团队预约当天会议室,时间各不相同,求最少需要几个会议室。比如:1预约的时间是[9-11], 2预约的时间是[10-12], 3预约的时间是[12-14], 此时会议最小个数是2个
常用算法
#######1.分治算法
算法的思路是什么?
:把一个问题分解成许多相似的子问题,是用递归等方法,把结果汇聚到一起。
分治算法什么时候适用?
1.该问题缩小到一定规模就可以容易解决
2.该问题可以分解为若干规模较小的相同问题(具有最优子结构性质)
3.关键因素:该问题的解可以由分解出的子问题的解合并得出。(如果满足1,2不满足3可以考虑用贪心法或动态规划法)
4.影响效率的因素:分解出的每个子问题之间相互独立,不包含公共的子问题。(如果子问题不各自独立,则分治法需要做许多不必要的工作,此时用动态规划法更好)
分治算法解决的经典问题
(1)二分搜索
(2)大整数乘法
(3)Strassen矩阵乘法
(4)合并排序
(5)快速排序
(6)线性事件选择
(7)线性时间选择
(8)最接近点对问题
(9)循环赛日程表
(10)汉诺塔
#######2.动态规划算法
算法思路是什么?
:每次计算都会影响之后的计算
类似于分治算法,把问题拆分成小问题计算,和分治法的区别在于:下一个子问题的求解建立在上一个小问题的结果基础上
什么时候使用动态规划算法?
能采用动态规划算法一般要满足3个条件
1.最优化原理,问题的最优解所包含的子问题都是最优解,具有最优子结构的特点
2.无后效性,某一阶段一旦确定,不会受后来的影响发生变化
3.有重复子问题:子问题之间不独立,一个子问题在下一个阶段决策中可能被多次使用到。(最影响效率的条件,满足该条件才能提现出动态规划算法的优势)
动态规划基本框架
#######3.贪心算法
贪心算法的思路是什么?
:计算的每一步都是当前的最优解,不去考虑全局最优解的情况
适用条件
1.无后效性
2.局部最优导致全局最优
贪心算法的实现框架
从问题的某一初始解出发;
while(能朝给定总目标前进一步)
{
利用可行决策,求出可行解的一个解元素;
}
由所有解元素组成问题的一个可行解
#######4.回朔法
一种有限深度算法,每次发现现在的选择是不正确的,于是回到之前的节点进行其他计算,而现在的节点称为回朔点
用回朔法解题的一般步骤:
(1)针对所给问题,确定问题的解空间(至少包含问题的一个最优解)
(2)确定节点的扩展搜索规则
(3)以深度优先方式搜索解空间,并在搜索过程中用剪枝函数,避免无效搜索。
#######5.分支界限法
类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。
区别:回溯法求解目标是找出满足约束条件的所有解而分支限界法的求解目标是找出满足约束条件的一个解,某种意义下的最优解
大脑喜欢问题。当你在学习或读书过程中提出问题的时候,大脑会自动搜索答案,从而提高你的学习效率。从这个角度说,一个好的问题胜过一个答案。