序号 |
页码 |
题目描述 |
解题思路 |
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 |
二叉树的最近公共祖先 |
递归 |