参考了面试必刷-《剑指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