本文为《剑指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. 剑指offer题目汇总

    剑指pffer题目汇总 一.线性表 1.数组 思路总结:https://blog.csdn.net/Lollipop66/article/details/80816166 面试题3:数组中重复的数字 ...

  2. 剑指Offer Ⅱ 003.二进制加法(力扣剑指Offer专项突击版——整数_3)

    题目 给定一个非负整数 n ,请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数,并输出一个数组. 示例 1: 输入: n = 2 输出: [0,1,1] 解释: 0 --> 0 1 ...

  3. 剑指 Offer II 022. 链表中环的入口节点(力扣剑指Offer专项突击版——链表2)

    题目 给定一个链表,返回链表开始入环的第一个节点. 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 po ...

  4. 剑指Offer Ⅱ 005.单词长度的最大乘积 (力扣剑指Offer专项突击版——整数_5)

    题目 给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值.假设字符串中只包含英语的小写字母.如果没有不包含相同字符的一 ...

  5. 剑指Offer Ⅱ 001. 整数除法(力扣剑指Offer专项突击版——整数_1)

    题目 给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 '*'.除号 '/' 以及求余符号 '%' . 注意: 整数除法的结果应当截去(truncate)其小数部分,例如:tr ...

  6. 力扣剑指 Offer 17. 打印从1到最大的n位数

    题目描述 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数.比如输入 3,则打印出 1.2.3 一直到最大的 3 位数 999. 示例 示例 1:输入: n = 1 输出: [1,2,3,4 ...

  7. 力扣 剑指 Offer 10- I. 斐波那契数列

    文章目录 题目 思路 AC代码 题目 斐波那契数列 思路 这次的斐波那契数列不太一样,它输入的数值会很大,远远超过long long的取值范围.所以我们要在滚动数组的同时处理这些数. 注意1e9类的数 ...

  8. 力扣—剑指 Offer 45. 把数组排成最小的数

    题目 解决方法 参看官方解决思路,就是将数列中的元素两两拼接.如'2'+'3'='23'<'3'+'2'='32'则2在3的左边.由于该题不用考虑组合后第一位是零的情况,所以这样将所有的元素比较 ...

  9. 力扣剑指 Offer 05. 替换空格(JavaScript)

    扩大数组,定义双指针从后往前遍历,如果为空,则填入20% var replaceSpace = function(s) {//转化为数组let arr=Array.from(s)//计算空格数let ...

  10. 力扣剑指offer——二叉树篇

    ✔✨前言

最新文章

  1. kafka消息会不会丢失
  2. 数据文件实验#OCP#
  3. HTML与JS交换值
  4. 填充table_Excel Power Query | 向下填充的逆过程
  5. MySQL5与Tomcat-5.5的常用配置文件
  6. 高考英语口试计算机系,高考英语口试材料.docx
  7. Spring Boot 面试题整理
  8. php 连接主从redis,PHP7对Redis的扩展及Redis主从搭建
  9. 智能云如何加速产业智能化?百度CTO王海峰2020全球智博会擘画蓝图
  10. 新浪微博php7升级实践,PHP7线上system time飙高问题
  11. Android 逆向分析(三)之动态调试Smali
  12. P3649 [APIO2014]回文串
  13. 深入理解android卷2 豆瓣,豆瓣blog
  14. 将 N 叉树编码为二叉树
  15. 320、Vue学习笔记26 -【生产环境部署】 2020.04.20
  16. 读书笔记:[AWL]-2021.9.7
  17. 计算机二级怎么样分屏方便,全国计算机等级考试二级教程
  18. C++实现通用的文件(万能)加密方案——包含源码
  19. 爷青回!最近很火的朋友圈怀旧小电视源码来啦!看到最后一个视频我大呼好家伙!
  20. 在React中解析渲染markdown文件

热门文章

  1. mysql中如何批量删除冗余数据库_WordPress清理数据库中的冗余数据加速网站运行速度...
  2. Python整理PEER所下载的地震波源数据——提取地震波至txt+生成地震波反应谱
  3. HTML开发者工具抓取所有图片,利用开发者工具,截取网页高清长图
  4. 联想笔记本键盘亮屏幕不亮_笔记本电脑进入睡眠状态后无法通过鼠标或键盘来唤醒屏幕怎么解决...
  5. JAVA开发的人力资源管理系统
  6. python3简单爬取妹纸图网站图片
  7. weblogic开发EJB
  8. 北京市昌平区卫星地图离线包下载
  9. 猎豹网校 ASP.NET全套教程
  10. SpringBoot+SQLSERVER2000问题 简要总结