1. 1. 经典
a. 斐波那契数列
i. 虽然非常简单,但是变种非常多,热门点
ii. 递归算法,青蛙跳台阶问题等等
b. 汉诺塔
i. 初级,求移动次数
ii. 高级,求移动路径,本质一样,需要设计一下递归函数
c. 岛屿数量(二维数组的BFS)
i. 二维数组进行遍历,找到第一块儿陆地,加入队列
ii. 开始循环出队,先将出队节点加入Set中,作为已用节点
iii. BFS寻找与该点相邻的陆地加入队列中,如果相邻的点已被用过,则不加入队列
iv. 循环至队列为空,此时求得第一个岛屿的所有点集合
v. 将二维数组中这些点标记为0,总的岛屿数+1
vi. 继续重复以上循环,直到找不到陆地位置
vii. 时间复杂度为n^2
d. 括号字符串的生成,给n,合法的括号字符串的全排列(类似全排列)
i. 借助队列,生成所有串,最后借助set去重
ii. 出队字符串重新生产新串,从0位置开始加(, 尾部加)
iii. 时间复杂度n^2
e. 容器盛水问题
i. 双指针
ii. 如果左边小于右边,从左往右靠,一次靠一格,
1. 1. 如果当前位置小于左侧,计算水量
2. 2. 如果当前位置大约左侧,更新边界的最大值为当前位置值
iii. 如果左边大于右边,从右往左靠,一次靠一格,类似上步操作
iv. 最终返回水的量
v. 时间复杂度n
f. 滑动窗口的最大值
i. 大根堆+双指针
ii. 创建大根堆,大小为滑动窗口大小
iii. 将数组前n个数放入大根堆中
iv. 当大根堆size==n时,每次peek堆顶元素,并加入到list中
v. 删除堆中值为数组中第i-size个的元素,并将数组中的元素入堆,直到数组为空
vi. 时间复杂度log(Size)n, 空间复杂度 Size
g. 求平方根
i. 二分查找
ii. 从res=x/2开始,如果res的平方小于x,求 [res,x]这个区间
iii. 如果res平方大于x,求[0, res])区间,以此类推
iv. 处理越界情形和边界相等的情形
v. 时间复杂度log(n)
h. 数组中出现一次的两个数字
i. 数组中出现一次的数字,全部异或^,得到的就是
ii. 对于两个的情况,其实要分组,然后转为为1个的情形
iii. 全部异或,然后得到一个数字,找到这个二进制字中的第一个不是0的位置
iv. >>移位, &与运算
v. 通过这个位置,把所有元素分为两组, 分别求每组中出现一次的数字
i. 数组中有一个数字出现1次,其余都出现k次,求这个数字
i. Int类型长度32位,对于数组中的数字,求所有位置上➗k的余数,组合起来
ii. 第一次for循环,遍历位数
iii. 内部遍历数组,求数组中当前位置的值的和,右移i位求和
iv. 这个位置的和模k,结果向左移位, 加到最终返回的结果上
v. 时间复杂度32n
j. 孩子分糖果问题
i. 如果就一个人,返回1
ii. 初始化数组,num[0]=1
iii. 从1号开始,左到右扫一遍,只要比左边大,num[i]=num[i-1]+1
iv. 从n-2号开始,从右往左扫一遍num[i]=num[i+1]+1
v. 最后求num的和
k. 给定一个字符串数组,找到一种拼接顺序,使得字典序最小
i. 对数组进行排序
ii. StringBuildersb=new StringBuilder(); sb.append();
iii. (str1+str2).compareTo(str2+str1);
l. LRU
i. 构造class集成linkedHashMap,重写removeEldestEntry>
m. 最大公约数
i. 辗转相除法