力扣【剑指offer】题目汇总与总结

本文详细总结了刷《剑指offer》过程中遇到的75道题,涵盖数组、字符串、链表、栈、队列、树、图等多个数据结构与算法,包括二分法、哈希表、递归等技术。重点讲解了数组的旋转、查找、剪绳子问题,字符串的排列与子串查找,链表的反转与合并,栈的实现队列,树的遍历与构建,位运算的应用,动态规划解决斐波那契数列等问题。此外,还涉及图的路径搜索和贪心算法在股票交易中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文为《剑指offer》刷题笔记的总结,花费不到两个月的时间将力扣上《剑指offer》的75道题刷了一遍,遇到不会的知识点或者应该做一些记录的题目都将其写在了往日的博客里。

整体来看,这75道题,涉及到常用的数据结构:数组、字符串、链表、栈、队列、树、图,还有一些常用的数据操作和算法:二分法、哈希表、递归、排序、查找、位运算、动态规划、回溯、滑动窗口、双指针、深度优先搜素(DFS)、贪心。

1、数组

(1)剑指offer03.数组中重复的数字

(2)剑指offer04.二维数组中的查找。解法:找标志数。正确思路是首先进行非空判断,即排除matrix=[]和matrix=[[]],然后找标志数,找左下角数字作为标志数,它为第一列最大数字,是本行最小数字。如果target 大于该数则向上查找,否则往右查找。具体解法

(3)剑指offer11.旋转数组的最小数字

(4)剑指offer14-I.剪绳子

(5)剑指offer14-II.剪绳子II。解法:考虑大数越界的情况下的求余问题,可能超过int的范围。大数求余方法包括循环求余(O(N))和快速幂(log2(N))求余。第二者的时间复杂度更低。具体解法

(6)剑指offer17.打印从1到最大的n位数

(7)剑指offer21.调整数组顺序使奇数位于偶数前面

(8)剑指offer39.数组中出现次数超过一半的数字。解法:摩尔投票法或数组排序法。摩尔投票法:记首个元素为n1,众数为x,遍历并统计票数。利用票数和=0可缩小剩余数组区间。当遍历完成时,最后一轮假设的数字为众数。具体解法

(9)剑指offer40.最小的k个数

(10)剑指offer41.数组流中的中位数(困难)。解法:小顶堆和大顶堆。具体解法

(11)剑指offer45.把数组排成最小的数。解法:快速排序。具体解法

(12)剑指offer49.丑数。解法:动态规划,丑数只包括因子2,3,5,因此“丑数=某较小丑数*某因子”。  具体解法

(13)剑指offer51.数组中的逆序对。解法:归并排序,使用分治,通过不断划分数组,直至到两个部分时再逐一判断。具体解法

(14)剑指offer53-I.在排序数组中查找数字

(15)剑指offer53-II.0~n-1中缺失的数字。解法:二分法。 具体解法

(16)剑指offer57-I.和为s的两个数字

(17)剑指offer57-II.和为s的连续正数序列。解法:滑动窗口。具体解法

(18)剑指offer59-I.滑动窗口的最大值

(19)剑指offer61.扑克牌的顺子。解法:排序。先对数组执行排序,然后判别重复,最后获得最大/最小的牌。具体解法

(20)剑指offer64.求1+2+...+n。解法:递归+逻辑运算符短路效应。具体解法

(21)剑指offer66.构建乘积数组。解法:上、下三角。根据表格主对角线(全为1),可将表格分为上三角和下三角两部分。分别迭代计算下三角和上三角两部分的乘积。引入辅助变量res=1,首先算B[i]的下三角各元素的乘积,直接乘入B[i],然后计算B[i]的上三角各元素的乘积,记为res,并乘入B[i]。具体解法

2、字符串

(1)剑指offer05.替换空格

(2)剑指offer20.表示数值的字符串。解法:枚举。在遍历字符串的过程种,记录下4种关键信息(是否包含数字、包含小数点,记录小数点的坐标、包含正负号、包含e,记录e的坐标)。具体解法

(3)剑指offer38.字符串的排列。解法:DFS+剪枝。具体解法

(4)剑指offer48.最长不含重复字符的子字符串。解法:滑动窗口+哈希表。本题采用滑动窗口,利用哈希表来做优化。使用哈希表记录每个字符的下一个索引,然后尽量向右移动尾指针来拓展窗口,并更新窗口的最大长度。如果尾指针指向的元素重复,则头指针直接移动到窗口中重复元素的右侧。具体解法

(5)剑指offer50.第一个只出现一次的字符。解法:哈希表。首先遍历字符串s,使用哈希表统计“各字符数量是否>1”,然后再遍历字符串s,在哈希表中找到首个“数量为1的字符”。具体解法

(6)剑指offer58-I.反转单词顺序。解法:双指针。具体解法

(7)剑指offer58-II.左旋转字符串

(8)剑指offer67.把字符串转换成整数。解法:大数越界。考虑四种字符首部字符、符号位、非数字字符和数字字符。在数字越界处理方面,在每轮数字拼接前,判断res在拼接后是否超过2147483647,若超过则加上符号位直接返回。具体解法

3、链表

(1)剑指offer06.从尾到头打印链表

(2)剑指offer18.删除链表的节点

(3)剑指offer22.链表中倒数第k个节点。解法:双指针法。具体解法

(4)剑指offer24.反转链表

(5)剑指offer25.合并两个排序的链表

(6)剑指offer35.复杂链表的复制。解法:拼接+拆分。考虑构建原节点 1 -> 新节点 1 -> 原节点 2 -> 新节点 2 -> …… 的拼接链表,如此便可在访问原节点的 random 指向节点的同时找到新对应新节点的 random 指向节点。具体解法

(7)剑指offer52.两个链表的第一个公共节点

4、栈与队列

(1)剑指offer09.两个栈实现队列

(2)剑指offer30.包含min函数的栈

(3)剑指offer31.栈的压入、弹出序列。解法:栈的压入与弹出。具体解法

(4)剑指offer59-II.队列的最大值

5、树

(1)剑指offer07.重建二叉树。解法:在前序遍历结果中,最左边的元素preorder[0]就是二叉树的根节点,而在中序遍历的结果中,找到preorder[0]元素对应的下标,那么preorder[0]左边所有的元素是属于preorder[0]为根的左子树,preorder[0]右边的元素是以preorder[0]为根的右子树,然后进行递归。具体解法

(2)剑指offer26.树的子结构。解法:先序遍历。具体解法

(3)剑指offer27.二叉树的镜像

(4)剑指offer28.对称的二叉树。解法:后序遍历。过递归函数的返回值来判断两个子树的内侧节点和外侧节点是否相等。具体解法

(5)剑指offer32-I.从上到下打印二叉树

(6)剑指offer32-II.从上到下打印二叉树

(7)剑指offer32-III.从上到下打印二叉树。解法:双端队列。具体解法

(8)剑指offer33.二叉搜索树的后续遍历序列。解法:划分左右子树递归。具体解法

(9)剑指offer34.二叉树中和为某一值的路径。解法:回溯法,包含先序遍历+路径记录两部分。具体解法

(10)剑指offer36.二叉搜索树与双向链表。解法:中序遍历。具体解法

(11)剑指offer37.序列化二叉树。解法:DFS深度优先搜素。具体解法

(12)剑指offer54.二叉搜索树的第k大节点

(13)剑指offer55-I.二叉树的深度

(14)剑指offer55-II.平衡二叉树。解法:后序遍历。具体解法

(15)剑指offer68-I.二叉搜索树的最近公共祖先

(16)剑指offer68-II.二叉树的最近公共祖先。解法:后序遍历--回溯。具体解法

6、位运算

(1)剑指offer15.二进制中1的个数。解法:十进制转二进制。首先将十进制数字转化为二进制数,然后在二进制数中查找字符'1'。具体解法

(2)剑指offer16.数值的整数次方。解法:快速幂。具体解法

(3)剑指offer56-I.数组中数字出现的次数。解法:位运算中的异或。具体解法

(4)剑指offer56-II.数组中数字出现的次数

(5)剑指offer65.不用加减乘除做加法。解法:位运算中的无进位和与异或,进位和与运算规律相同。具体解法

7、动态规划

(1)剑指offer10-I.斐波那契数列

(2)剑指offer10-II.青蛙跳台阶问题。解法:动态规划。跳上n 级台阶有 f(n)种跳法。在所有跳法中,青蛙的最后一步只有两种情况:跳上1级或2级台阶,即 f(n)=f(n-1)+f(n-2)。 具体解法

(3)剑指offer19.正则表达式匹配。解法:动态规划。具体解法

(4)剑指offer42.连续子数组的最大和。解法:动态规划。具体解法

(5)剑指offer46.把数字翻译成字符串。解法:动态规划。具体解法

(6)剑指offer47.礼物的最大值

(7)剑指offer60.n个骰子的点数。解法:动态规划。具体解法

(8)剑指offer62.圆圈中最后剩下的数字。解法:约瑟夫环问题,f(n,m)=[f(n-1,m)+m]%n。具体解法

8、图

(1)剑指offer12.矩阵中的路径。解法:DFS+剪枝。标记当前矩阵元素,搜索下一个单元格,还原当前矩阵元素。具体解法

(2)剑指offer13.机器人的运动范围。解法:DFS。通过分析机器人只能从右或下两个方向进行行走才能到达满足条件的格子(可达解)。具体解法

(3)剑指offer29.顺时针打印矩阵。解法:将矩阵的上t、下b、左l、右r四个边界用于打印的res列表,然后进行从左向右、从上到下、从右到左和从下到上的顺序进行循环(根据边界将元素按顺序添加到res列表的尾部,边界向内收缩1,判断边界是否相遇)。 具体解法

9、贪心算法

剑指offer63.股票中的最大利润。解法:贪心算法,因为股票就买卖一次,那么贪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利润。具体解法

10、找规律

(1)剑指offer43.1~n整数中1出现的次数。解法:通过枚举找规律。具体解法

(2)剑指offer44.数字序列中某一位的数字。解法:找规律。具体解法

剑指Offer》 1. 赋值运算函数 2. 单例设计模式 3. 二维数组中查找目标值 4. 替换字符串中的空格 5. 从尾到头打印链表 6. 由前序和中序遍历重建二叉树 7. 用两个栈实现队列 8. 求旋转数组的最小数字 9. 斐波那契数列的第n项(青蛙跳台阶) 10. 二进制中1的个数 11. 数值的整数次方 12. 打印1到最大的n位数 13. O(1)时间删除链表节点 14. 使数组中的奇数位于偶数前面 15. 找链表中倒数第K个节点 16. 输出反转后的链表 17. 合并两个有序链表 18. 判断二叉树A中是否包含子树B 19. 二叉树的镜像 20. 顺时针打印矩阵 21. 包含min函数的栈 22. 判断一个栈是否是另一个栈的弹出序列 23. 层序遍历二叉树 24. 后序遍历二叉搜索树 25. 二叉树中和为某值的路径 26. 复杂链表的复制 27. 二叉搜索树转换为双向链表 28. 打印字符串中所有字符的排列 29. 数组中出现次数超过一半的数字 30. 找出最小的K个数 31. 连续子数组的最大和 32. 从1到整数n中1出现的次数 33. 把数组中的数排成一个最小的数 34. 求第N个丑数 35. 第一个出现一次的字符 36. 数组中逆序对的个数 37. 两个链表的第一个公共节点 38. 数字在排序数组中出现的次数 39. 二叉树的深度 40. 数组中只出现一次的两个数,而其他数都出现两次 41. 和为s的连续整数序列 42. 翻转字符串 43. n个骰子的点数及出现的概率 44. 扑克牌的顺子 45. 圆圈中最后剩下的数 46. 1+2+3+...+n的和 47. 不用加减乘除做加法 48. 不能被继承的类 49. 字符串转换为整数 50. 树中两个节点的最低公共祖先 51. 找出重复的数 52. 构建乘积数组 53. 正则表达式匹配 54. 表示数值的字符串 55. 字符流中第一个不重复的字符 56. 链表中环的入口节点 57. 删除链表中重复的节点 58. 二叉树的下一个节点 59. 对称的二叉树 60. 按之字形顺序打印二叉树 61. 把二叉树打印成多行 62. 序列化二叉树 63. 二叉搜索树的第K个节点 64. 数据流中的中位数 65. 滑动窗口的最大值 66. 矩阵中的路径 67. 机器人的运动范围
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值