参考了面试必刷-《剑指offer》刷题小结 - 简书 (jianshu.com) 整理的分类,给出大概思路,存个档。
数据结构类题目
LinkedList
003-从尾到头打印链表 暴力,反转列表打印
014-链表中倒数第k个结点 双指针
015-反转链表 双指针
016-合并两个或k个有序链表 双指针
025-复杂链表的复制 遍历两遍,字典
036-两个链表的第一个公共结点 双指针
055-链表中环的入口结点 双指针
056-删除链表中重复的结点 遍历,判断p.next
Tree
004-重建二叉树 递归
017-树的子结构 双层递归: 遍历+匹配
018-二叉树的镜像 层序遍历
022-从上往下打印二叉树 层序遍历
023-二叉搜索树的后序遍历序列 双栈
024-二叉树中和为某一值的路径 双层递归:遍历+匹配
026-二叉搜索树与双向链表
038-二叉树的深度 dfs
039-平衡二叉树
057-二叉树的下一个结点
058-对称的二叉树 暴力-层序遍历,挨个比较;技巧-递归,l.right = r.left, l.left = r.right;
059-按之字形顺序打印二叉树
060-把二叉树打印成多行
061-序列化二叉树
062-二叉搜索树的第k个结点 栈
005-用两个栈实现队列
020-包含min函数的栈
021-栈的压入、弹出序列
044-翻转单词顺序列 栈
064-滑动窗口的最大值 双端队列
Heap
029-最小的K个数
034-第一个只出现一次的字符图
065-矩阵中的路径 暴力-DFS+剪枝
066-机器人的运动范围 暴力-DFS;技巧-染色,上或左为可访问,则该点可访问
具体算法类题目
斐波那契数列
007-斐波拉契数列 数学公式
008-跳台阶 dp[i] = dp[i-1]+dp[i-2]+…+dp[i-k] 青蛙能跳到k步的情况
009-变态跳台阶
010-矩形覆盖搜索算法
001-二维数组查找 暴力-按顺序遍历;技巧-以右上角为root,看作一个搜索二叉树
006-旋转数组的最小数字 二分查找
037-数字在排序数组中出现的次数 二分查找
全排列
027-字符串的排列动态规划
030-连续子数组的最大和 动规,dp[i] = dp[i-1] < 0? nums[i] : nums[i]+dp[i-1]
052-正则表达式匹配 回溯
065-矩阵中的路径 BFS
066-机器人的运动范围 暴力-DFS;技巧-染色,上或左为可访问,则该点可访问
排序
035-数组中的逆序对 归并排序
029-最小的K个数 插入排序,快排,堆排序
位运算
011-二进制中1的个数 位运算
012-数值的整数次方
040-数组中只出现一次的数字
其他算法
002-替换空格
013-调整数组顺序使奇数位于偶数前面
028-数组中出现次数超过一半的数字
031-整数中1出现的次数(从1到n整数中1出现的次数)
032-把数组排成最小的数
033-丑数
041-和为S的连续正数序列 滑动窗口
042-和为S的两个数字 双指针
043-左旋转字符串 矩阵翻转
046-孩子们的游戏-圆圈中最后剩下的数 约瑟夫环 最后留下的人索引为r,则每一轮
r = (r+m)%i (i = 2,3,4…n)
051-构建乘积数组
014-剪绳子 动归:dp[i]*dp[n-i]; 贪心:大于五时,尽可能多的凑3