剑指offer题目汇总

序号

页码

题目描述

解题思路

3

p39

数组中任意一个重复的数字

1、哈希表 

2、交换

 

p41

不修改数组找出数组中任意一个重复的数字

1、哈希表

2、二分

4

p44

递增二维数组中的查找

从右上角开始

5

p51

替换字符串中的空格

从后往前+双指针

 

p55

合并两个排序数组

从后往前+双指针

6

p58

从尾到头打印链表

1、栈

2、递归

⚠️链表过长会导致函数调用栈溢出

7

p62

根据前序遍历和中序遍历重建二叉树

根据前序遍历找到根节点,根据中序遍历判断左右子树

8

p65

中序遍历序列的下一个节点

分三种情况考虑

9

p68

用两个栈实现队列

不用每次交替使用两个stack

 

p71

用两个队列实现栈

需要每次交替使用两个queue

10

p74

斐波那契数列

动归

⚠️空间压缩

 

p77

青蛙跳台阶

变形成为斐波那契数列

 

p79

小矩形覆盖大矩形

变形成为斐波那契数列

11

p82

旋转数组中的最小数字

二分

⚠️完全有序数组

⚠️元素重复

12

p89

寻找字符矩阵中的字符串路径

回溯

13

p92

机器人运动范围

回溯

14

p96

剪绳子

1、动态规划

⚠️注意对称性

2、贪心算法(尽可能剪3)

证明:当n>=5时,2(n-2)>n,3(n-3)>n且3(n-3)>=2(n-2)

15

p100

二进制中1的个数

1、左移1,做与运算(时间与二进制位数相关)

2、把一个整数减去1,再和原整数做与运算,得到的结果相当于把整数的二进制表示中最右边的1变成0(时间与二进制中1的个数相关)

 

p103

判断一个整数是不是2的整数次方

2的整数次方的二进制表示中只有一个1

 

p103

需要改变m的二进制表示中的多少位才能得到n

先异或,再求二进制表示中1的个数

16

p110

某个数的整数次方(不考虑大数)

递归

⚠️指数是负数

⚠️底数是0且指数是负数

⚠️右移代替除2,与代替求余判断奇偶

17

p114

打印从1到最大的n位数

大数问题

1、字符串模拟加法&打印

2、递归全排列

18

p119

在O(1)的时间内删除链表节点

狸猫换太子

⚠️头尾节点 -> 加dummy

 

p122

删除链表中重复的节点

顺序查看

19

p124

正则表达式匹配

1、递归

2、动归

20

p127

判断一个字符串是否表示某个数值

A[.[B]][e|EC]

21

p129

调整数组顺序使奇数位于偶数前面

双指针+交换+解耦

22

p134

链表中倒数第k个节点

早晚指针

⚠️k=0

⚠️链表中节点个数小于k

 

p138

链表中间的节点

早晚指针

23

p139

链表中环的入口节点

1、先找出环中任意一个节点,再得到环中节点的数目,最后找到环的入口节点

2、Floyd判圈法

24

p142

反转链表

顺序反转

25

p145

合并两个排序的链表

1、迭代

2、递归

26

p148

树的子结构

递归:1、找到A树上子树的起始点;2、判断两棵子树是否同构

⚠️可能要重复多次1 -> 因为A树可能有多个节点的值等于B树root的值

27

p157

二叉树的镜像

递归交换左右节点

28

p159

对称的二叉树

递归判断左右叶子节点是否相等

29

p161

顺时针打印矩阵

不断向内压缩

30

p165

提供min函数的栈

两个栈

31

p168

给定一个栈的压入序列,判断弹出序列是不是这个栈的弹出序列

模拟栈

32

p171

不分行从上到下打印二叉树

层序遍历

 

p174

分行从上到下打印二叉树

层序遍历

⚠️开始遍历一层的节点时,当前队列中的节点数就是当前层的节点数

 

p176

之字形打印二叉树

两个栈,分奇偶层

33

p179

二叉搜索树的后序遍历序列

先找到根节点,再找到左右子树的划分点,判断右子树是否都大于根节点

34

p182

二叉树中和为某一值的路径

递归

35

p187

复杂链表的复制

1、哈希(空间换时间)

2、三步走(利用链表找next为O(1)的特性)

36

p191

根据二叉搜索树创建排序的双向链表

中序遍历,记录前一个节点

37

p194

序列化和反序列化二叉树

1、DFS

2、BFS

38

p197

字符串的排列

回溯

 

p199

字符串的组合

1、回溯(选或不选)

2、位图

 

p200

正方体相对面顶点和相等

转换成数字全排列问题

 

p200

八皇后问题

回溯

 

 

按照一定要求摆放若干个数字

先求出数字的所有排列,然后判断每个排列是否满足题目给定的要求

39

p205

数组中出现次数超过一半的数字

1、哈希表

2、基于Partition函数 O(n)

3、投票法(不断压缩数组范围)

40

p209

数组中最小的K个数

1、基于Partition函数 O(n)

⚠️需要把整个数组放入内存 -》不适合数据量大的情况

⚠️原数组会被修改

2、最大堆 O(nlogK)

41

p214

数据流中的中位数

一个最大堆+一个最小堆

42

p218

连续子数组的最大和

动态规划找突破,相加为负可舍弃

43

p221

1~n整数的十进制表示中1出现的次数

找规律

⚠️给定一个数字,可以将其转成字符串,字符串长度即位数;最高位即字符串第0位

44

p225

将数字连续排列成一个字符串,求字符串第n位是哪个数字

找规律

45

p227

把数组中的所有数字排列成一个最小的数

定义新的排序规则

46

p231

把数字翻译成字符串的翻译方法

动归

47

p233

最多拿到多少价值的礼物

动归

48

p236

最长不含重复字符的子字符串

动归

⚠️可以新建数组保存每个字符上次出现的位置从而避免向前遍历

49

p240

第n个丑数

使有序

50

p243

数组中第一个只出现一次的字符

哈希表

51

p249

数组中的逆序对个数

归并排序

52

p253

两个链表的第一个公共节点

双指针

53

p263

数字在排序数组中出现的次数

二分

 

p266

0~n-1中缺失的数字

二分

 

p267

数组中数值和下标相同的元素

二分

54

p269

二叉搜索树的第k大节点

反向中序遍历

55

p271

二叉树的深度

递归

 

p273

是否是平衡二叉树

递归

⚠️利用返回值=-1进行剪枝

56

p275

数组中只出现一次的两个数字

分组异或

 

p278

数组中其它数字都出现了n(n>2)次,求只出现一次的一个数字

按位余n

57

p280

在递增数组中找到和为s的两个数字

双指针

 

p282

和为s的连续正整数序列

双指针

58

p284

翻转字符串

1、split函数

2、原址翻转 -> 整体翻转再单个单词翻转

 

p286

左旋转字符串

 

59

p288

滑动窗口的最大值

单调队列

 

p292

队列的最大值

单调队列

60

p294

n个骰子出现点数的可能性

动归

61

p296

判断五张牌是否能组成扑克牌中的顺子

1、排序+遍历

2、判断无重复+max-min<5

62

p300

圆圈中最后剩下的数字

1、模拟环形链表

2、逆向推导

63

p304

买卖股票的最大利润

存储当前最小

64

p307

求1+2+...+n

&&实现ifelse

65

p310

不用加减乘除模拟加法

加法分两步:基数+进位

求基数:异或

求进位:相与<<1

 

p312

不使用新的变量交换两个变量的值

1、基于加减

a = a+b; b = a-b; a = a-b;

2、基于异或

a = a^b; b = a^b; a = a^b;

66

p312

构建乘积数组

动归

67

p318

把字符串转换成整数

注意溢出

68

p327

二叉搜索树的最近公共祖先

善用二叉搜索树的性质 -> 左边比中间小,右边比中间大

 

p327

二叉树的最近公共祖先,节点有指向父节点的指针

转变成求两个链表的第一个公共节点

 

p328

二叉树的最近公共祖先

递归

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值