介绍
用于记录刷题笔记本,总结刷题技巧。
主题
Topic | Description |
---|---|
刷题记录 | leetcode题目中的刷题记录 |
关键点记录 | 一些常见的题目技巧、问题、记录 |
liangkang233’s blog | 个人博客主页 |
题目分析
-
1.两数之和 [array , hash table]
注意题意,每个输入问题只有一组解
-
2.两数相加 [linked-list , math]
看懂题目即可
-
3.无重复字符的最长子串 [hash-table , two-pointers , string , sliding-window ]
做法挺多 滑动窗口挺不错 类似题目 438.找到字符串中所有字母异位词
-
4.寻找两个正序数组的中位数 [ array , binary-search , divide-and-conquer]
使用二分法做,效率很高。注意:无论总个数是奇数还是偶数,其中位数都是第size/2 + 1 和 (size+1)/2)个元素的平均数
-
5.最长回文子串 [array , binary-search , divide-and-conquer]
动态规划经典题 扩展题516.最长回文子序列
-
6.z-字形变换 [string]
-
7.整数反转 [math]
不难,但是写的像shit 下次做优雅
-
8.字符串转换整数-atoi [math , string]
能想出状态机法确实很难,普通做法类似题目7
-
9.回文数 [math]
判断一个数(非string)是否回文的高效方法
-
10.正则表达式匹配 [string , dynamic-programing , backtracking]
经典动态规划,值得多刷
-
11.盛最多水的容器 [array , two-pointers]
这个双指针是真的难顶,直觉的做法就是对的 证明好好理解
-
12.整数转罗马数字 [math , string]
-
13.罗马数字转整数 [math , string]
-
14.最长公共前缀 [string]
-
15.三数之和 [array , two-pointers]
双指针,排序后 遍历 确定第一个字符, 剩下的两个 i+1 size-1指针遍历判断 可以证明 这样找不会重复,记得去重
-
17.电话号码的字母组合 [string , backtracking]
-
19.删除链表的倒数第-n-个结点 [linked-list , two-pointers]
常规方法使用栈,只扫描一次的方法: 快指针到达队尾后 慢指针再行动即可。
-
20.有效的括号 [string , stack]
题不难 条件判断多
-
21.合并两个有序链表 [linked-list]
合并k链表前提
-
22.括号生成 [string , backtracking]
我理解回溯就是采用了剪枝的最终变量是传参的dfs(普通dfs最终变量不可回溯输出变量)
-
23.合并k个升序链表 [linked-list , divide-and-conquer , heap]
经典分治、优先队列做法,值得多刷
-
24.两两交换链表中的节点 [linked-list]
构建虚拟头 节省操作
-
25.k-个一组翻转链表 [linked-list]
链表翻转操作的进阶题 206.反转链表
-
26.删除有序数组中的重复项 [array , two-pointers]
-
27.移除元素 [array , two-pointers]
-
28.实现-str-str [two-pointers , string]
经典的KMP 没想到居然是简单题?? 直接调用现有函数 strstr 也可完成。
-
29.两数相除 [math , binary-search]
此题有问题,慎做 可以复习下二进制补码的知识
-
30.串联所有单词的子串 [hash-table , two-pointers , string]
太难了 直接摆烂。以为是kmp 结果是滑动窗口 双指针
-
31.下一个排列 [array]
又是一道全排列题目 注意反转的起点 与判断条件加等号,太粗心了..
-
32.最长有效括号 [string , dynamic-programing]
可以使用栈的典型题目,也可以用动态规划,值得多刷。还有其他取巧的方法如正序扫一遍再逆序扫一遍。
-
33.搜索旋转排序数组. [array , binary-search]
二分搜索的经典题,类似题目153、154。二分搜索每次都要舍弃一半,从留下的一半中寻找目标;而分治法把一个大问题分成两个或多个小问题
-
34.在排序数组中查找元素的第一个和最后一个位置 [array , binary-search]
好题 多刷 二分怎么老是死在边界上,我靠。注意题中有可能输入为空,34 35可用同种二分做法
-
35.搜索插入位置 [array , binary-search]
小心边界,标准二分 看看二分的自实现 学习学习
-
36.有效的数独 [hash-table]
注意 & 优先级比 == 低 比&&高,这里吃了忘加括号的坑, 一道不错的测试bitmap题目
-
37.解数独 [hash-table , backtracking]
一开始需要填入已经存在的值作为初始值,其次回溯要注意的点这题都有,很经典 n皇后 类似
-
38.外观数列 [string]
-
39.组合总和 [array , backtracking]
dfs回溯记得要添加剪枝
-
40.组合总和-ii [array , backtracking]
需要去重和减枝 去重思路跟90.子集-ii一样
-
41.缺失的第一个正数 [array]
直接偷懒set一把梭,战术后仰 时间空间O(n)
类似这种题 只用空间1的必然需要修改原空间 这里取巧 对范围nums[i]1-n的值 直接放入nums[t-1]中,注意为 [3,4,0,1]这类答案 需要将替换的元素while判断下去。
-
42.接雨水 [array , two-pointers , stack]
很经典的题 单调栈 动态规划 (优化为双指针) 皆可。注意单调栈在使用时是计入区间内雨水 所以元素至少两个作为边界
-
43.字符串相乘 [math , string]
直接按照模拟的运算法则,num2的每一位乘上num1的每一位 再用415.字符串相加将数字相加,效果不好,而且代码量很大。官方直接用数组位来做 会好很多 之前的加法也应该这么做,真菜啊
-
44.通配符匹配 [string , dynamic-programming , backtracking , greedy]
与10.正则表达式匹配类似的做法,多刷 好题 自实现的匹配方案,这里引申下KMP算法:字符串匹配KMP
-
45.跳跃游戏-ii [array , greedy]
系列题目55.跳跃游戏 贪心即可不要想复杂了用dp
-
46.全排列 [backtracking]
典型回溯,不要混淆了全排列和全子集的区别(全子集可以有重复,全排列不可,题中元素无重复 可以做全子集的)
-
47.全排列-ii [backtracking]
其实c++std库里有全排列的函数 next_permutation() 这两题要二刷,当时写的时候没想清楚。也可以递归回溯 去重思路跟90.子集-ii一样
-
48.旋转图像 [array]
题目不难,写的很繁琐。实际上翻转操作可以 分解为 水平对转 主对角线反转。
-
49.字母异位词分组 [hash-table , string]
直接暴力做 map记录 记录同一字母异位字符的 数组下标,key是遍历元素的字符串排序后的值。优化点主要在转化的key上,我这种思路key对应的value是数组下标 效果还行。
-
50.pow-x-n [math , binary-search]
以位做运算统计累乘,用位来记录 temp[i] 代表 x^(2^i),(其实不需要保存这个数组) 递归二分的做法也许更好理解 写也方便
-
51.n-皇后 [backtracking]
-
52.n皇后-ii [backtracking]
经典回溯问题,跟51相同
-
53.最大子序和 [array , divide-and-conquer , dynamic-programming]
用分治的线段树或是动态规划(推荐)来做都不错,多刷几次
-
54.螺旋矩阵 [array]
这个判断条件没想到写的这么恼火
-
55.跳跃游戏 [array , greedy]
系列题目45.跳跃游戏-ii 贪心即可不要想复杂了用dp
-
56.合并区间 [binary-search , dynamic-programming]
官方写法更加优雅,下次刷尝试优化
-
57.插入区间 [arrary , sort]
好题 用二分走了不少弯路,最后还是要遍历push,不如一开始就找遍历合并区间的方法 边界问题 太蛋疼。这里二分推荐 在intervals右界限递增序列中 找到第一个 大于等于newInterval的左边界的迭代器。而不是全部左界限二分。
-
58.最后一个单词的长度 [string]
正确率只有38%,搞得有点慌以为有啥坑
-
59.螺旋矩阵-ii [array]
54.螺旋矩阵 类似题,解法差不多 此题用count下标似乎效果好些
-
60.排列序列 [math , backtracking]
以为又是一道全排列的题递归后发现不是字典序,修改后会超时 最后还是直接用k计算字典序来输出对应字符没用到回溯。
-
61.旋转链表 [linked-list , two-pointers]
先生成环链表再操作即可,k向右移动等于 head 向左移动
size - (k % size)
-
62.不同路径 [array , dynamic-programming]
-
63.不同路径-ii [array , dynamic-programming]
-
64.最小路径和 [array , dynamic-programming]
62-64都是动态规划典型题,可以刷下这几个练手复习
-
66.加一 [array]
-
67.二进制求和 [math , string]
-
69.x-的平方根 [math , binary-search]
注意边界, 求浮点数也可用二分 推荐牛顿法
-
70.爬楼梯 [dynamic-programming]
简易动态规划,注意使用 last now 节约空间
-
71.简化路径 [string , stack]
用栈记录上次的路径,尾部手动补一个’/’ 省得判断 自己写的很烂,不好看 推荐使用 双端队列 deque
-
72.编辑距离 [string , dynamic-programming]
动态规划 YYDS 583.两个字符串的删除操作 字符匹配问题 进阶题
-
73.矩阵置零 [array]
-
74.搜索二维矩阵 [array , binary-search]
二维二分 这道题的强化版 下1行第1个 不一定大于上1行最后1个 upper_bound 重载 进阶题240.搜索二维矩阵-ii
-
75.颜色分类 [array , two-pointers , sort]
自实现归并版 快排,如果用双指针 时间复杂度为O(n)
-
76.最小覆盖子串 [hash-table , two-pointers , string , sliding-window]
滑动窗口做的,之前做过好几道类似的。
-
77.组合 [backtracking]
ji剪枝 递归回溯 即可
-
78.子集 [array , backtracking , bit-manipulation]
数位操作 还真是奇思妙想,这题也算是典型的dfs回溯 类似题目90.子集-ii
-
79.单词搜索 [array , backtracking]
看到这种直接只要判断是否成立的题下意识的想用bfs。思考下觉得写的比dfs麻烦很多,因为初始状态还是需要遍历之后加队列。直接dfs 回溯标记数组效果不错快双百了。
这次学乖了,直接将四个方向的代码拆开写,不是之前那样for循环 时间会慢很多,缺点是代码看着冗余不简洁。
-
80.删除有序数组中的重复项-ii [array , two-pointers]
不使用额外空间的做法 即为直接双指针 无视无效数据 妙啊
-
82.删除排序链表中的重复元素-ii [linked-list]
链表难处理时,推荐添加一个虚拟头。加了delete 就很慢 刷题不考虑内存泄漏也太 👶🌶
-
83.删除排序链表中的重复元素 [linked-list]
-
84.柱状图中最大的矩形 [array , stack]
单调栈 739.每日温度 的进阶题
-
85.最大矩形 [array , hash-table , dynamic-programming , stack]
84进阶 真想不出来还能二维加单调栈
-
86.分隔链表 [linked-list , two-pointers]
链表边界处理有点麻烦
-
88.合并两个有序数组 [array , two-pointers]
写的那叫一个一言难尽
-
89.格雷编码 [backtracking]
一刷写的跟屎一样,有点怀疑人生 回溯硬解时间空间都花费的很大。还是得用位运算做啊。。 背公式
-
90.子集-ii [array , backtracking]
回溯题,使用78.子集的二进制迭代法做的话考虑去重没想出来,建议二刷。
-
91.解码方法 [dynamic-programming]
这道题动态规划的状态转移方程很好找 就是处理边界和特殊情况有点头疼,通过率居然只有31%
-
92.反转链表-ii [linked-list]
不方便处理链表的话 多加几个变量记录就好了。
-
93.复原-ip-地址 [string , backtracking]
没有技巧 纯编码
-
94.二叉树的中序遍历 [hash-table , stack , tree]
-
95.不同的二叉搜索树-ii [dynamic-programming , tree]
一开始思路错了,想常规的从root递归找。。。。
-
96.不同的二叉搜索树.cpp [dynamic-programming , tree]
理解题意即可,数学公式证明 卡塔兰数
-
98.验证二叉搜索树 [tree , depth-first-search]
中序深度递归,Solution3值得思考(二叉搜索树中序一定升序)
-
99.恢复二叉搜索树 [tree , depth-first-search]
中序遍历,查找修改即可,写起来有点绕
-
101.对称二叉树 [tree , depth-first-search , breadth-first-search]
-
102.二叉树的层序遍历 [tree , breadth-first-search]
-
103.二叉树的锯齿形层序遍历 [stack , tree , breadth-first-searchnode.]
可以使用栈来做,注意需要切换 入栈左右节点顺序每层遍历后需切换。官方使用queue来bfs,双端队列来存入数据。
-
104.二叉树的最大深度 [tree , depth-first-search]
-
105.从前序与中序遍历序列构造二叉树 [array , tree , depth-first-search]
使用分治递归的思想,此题结果唯一。类似题目889.根据前序和后序遍历构造二叉树,该题结果不唯一。
-
107.二叉树的层序遍历-ii [tree , breadth-first-search]
-
108.将有序数组转换为二叉搜索树 [tree , depth-first-search]
中点确定的不同 优先生成左右子树不同
-
113.路径总和-ii [tree , depth-first-search]
题目不难 蠢到用了个全局变量 导致测试案例 一直没过
-
114.二叉树展开为链表 [tree , depth-first-search]
将其压缩为只用空间1的链表还是需要构建一个返回尾部链表的节点mydfs。
-
115.不同的子序列 [string , dynamic-programming]
与 1143.最长公共子序列 很像
-
117.填充每个节点的下一个右侧节点指针-ii [tree , depth-first-search , breadth-first-search]
一般的做法是层序遍历的bfs,官方答案 能够节省空间复杂度 优秀
-
119.杨辉三角-ii [array]
杨辉三角的规律 等价排列组合
-
120.三角形最小路径和 [array , dynamic-programming]
-
121.买卖股票的最佳时机 [array , dynamic-programming]
-
122.买卖股票的最佳时机-ii [array , greedy]
-
123.买卖股票的最佳时机-iii [array , dynamic-programming]
虽然题目是动态规划,但是难点不在这。要结合121 来做,把整个区间分为两部分。对于遍历的从右往左,寻找规律与121就刚好相反。
-
124.二叉树中的最大路径和 [tree , depth-first-search]
后序dfs遍历即可,观察可知最大路径一定为某一节点下的左右子树的大于0的最大路径与自身相加,dfs下去将每个子树的最大路径求出,并更新对比ans。
-
125.验证回文串 [two-pointers , string]
没啥意思,遍历判断即可 这个判断条件写的很蠢
-
127.单词接龙 [breadth-first-search]
相似题 752.打开转盘锁
-
128.最长连续序列 [array , union-find]
很巧妙的用无序set 做排序判断连续值 时间复杂度O(n)
-
129.求根节点到叶节点数字之和 [tree , depth-first-search]
-
130.被围绕的区域 [depth-first-search , breadth-first-search , union-find]
dfs写的很差妄想用set结果反向优化了,这种dfs都不推荐用set,看看官方的吧。。。
-
131.分割回文串 [backtracking]
这道题需要考虑优化问题,可惜测试样例没有给大量的数据使用普通回文判断不会超时
-
132.分割回文串-ii [dynamic-programming]
131的进阶题,求出dp所有下标组合的长度后,还需用set去重的bfs求出最短路径。蠢到了,官方解法是再次动态规划,求出结果,多多学习。
-
133.克隆图 [depth-first-search , breadth-first-search , graph]
必须使用哈希表记录克隆无向表的连接 否则会陷入死循环 用unordered_set会使得双向图 变为 单向图
-
134.加油站 [greedy]
脑筋急转弯 遍历一遍找寻 合适的起点。若 某 A-B 最后不可 说明 A-B 中皆不可为起点 直接继续在 B+1 后遍历即可
-
136.只出现一次的数字 [hash-table , bit-manipulation]
貌似是第一次做leetcode的题,印象深刻
-
137.只出现一次的数字-ii [bit-manipulation]
数字电路的做法超级秀,常规哈希,高级点做法就是将数位拆分
-
139.单词拆分 [dynamic-programming]
用kmp做的话,例如s中为”abca“,给出字典中有 “a” 重复情况难做,感觉效果也不是很好。结果答案直接用个set动态规划,TNND。
-
141.环形链表 [linked-list , two-pointers]
快慢指针判断是否有环
-
142.环形链表-ii [linked-list , two-pointers]
141进接题目,需要找到循环点。建议再做一遍,链表是否相等 需要判断指针(地址)是否相等。非常巧妙的再次排序 得到终点值。
-
143.重排链表 [linked-list]
算是链表的综合应用,快慢指针找中点,再链表反转、合并。参考876.链表的中间结点 206.反转链表
-
146.lru-缓存 [design]
这道题有意思,map记录节点key,实际cache用双向链表。答案中使用自己实现的双向链表,最好直接用std的list。这里有个技巧:双向链表加一个伪头 伪尾,可以减少很多判断左右为空的操作 和 初始化赋值的操作
-
148.排序链表 [linked-list , sort]
经典排序题,考虑链表只能向后遍历的特殊性,用快慢指针找中点后归并排序。写的很烂 看看官方的
-
149.直线上最多的点数 [hash-table , math]
蓝桥杯省赛时做过这道题,当时只考虑到计算斜率,下考场后发现思路不对。现在添加双重hashmap记录尝试。可以优化为k与坐标的pair为键,需要自己添加 key 的hash函数。
-
150.逆波兰表达式求值 [stack]
理解题意即可
-
152.乘积最大子数组 [array , dynamic-programming]
动态规划 跟 53.最大子序和 一样,多维护一个最小值,好题。
-
153.寻找旋转排序数组中的最小值 [array , binary-search]
153 154 引导的不是很好,sort直接排序效果也很好。应该要求限制时间复杂度为logn,这里使用二分的前提是要各个元素不相同。
-
154.寻找旋转排序数组中的最小值-ii [array , binary-search]
此题给出数组允许了数据重复,不能直接如上做。 类似二分题目 33.搜索旋转排序数组.
-
160.相交链表 [linked-list]
一般做法是 set 记录遍历,双指针 重复遍历 真的妙 类似题目 142.环形链表-ii
-
162.寻找峰值 [array , binary-search]
二分应用题
-
167.两数之和-ii-输入有序数组 [array , two-pointers , binary-search]
两数之和,双指针 二分查排序数组 老套路了
-
169.多数元素 [array , divide-and-conquer , bit-manipulation]
题目不难,但是解法很多,其中时间复杂度O(n) 空间复杂度O(1) 的 Boyer-Moore 投票算法 很具有启发性。
-
172.阶乘后的零 [math]
妙,计算尾数的零就是找2和5的乘积,也就是找 n! 的所有数的5的因数(2是因数的个数必定多余5)。
-
173.二叉搜索树迭代器 [stack , tree , design]
题解题意即可,树的中序题目,若是使用O(h)空间复杂度需要用 中序的栈用法。好好思考
-
174.地下城游戏 [binary-search , dynamic-programming]
一开始按照这个思路写64.最小路径和,发现不对。最小值 和 累加和 两个因素不能在从左上到右下中等价 会出现矛盾。应该从右下往左上走(绝)。
-
187.重复的dna序列 [hash-table , bit-manipulation]
自己写的是朴素的滑动串口 将字符串转义为 7进制数据 用map记录出现次数。时间慢空间还行。答案是拿两位二进制做的 四个字符正好占用二进制的 00 01 10 11 思路一样 效果好些。
-
189.轮转数组 [array]
翻转字符串的方法做的,时间n 空间1
-
198.打家劫舍 [dynamic-programming]
动态规划 找出转移式
-
200.岛屿数量 [depth-first-search , breadth-first-search , union-find]
注意题目的数据元素是char 搞了半天找不到错,少用嵌套数组查 速度会慢很多 更不要用forrange:
for(auto &&i : v)
直接超时就离谱。 -
201.数字范围按位与 [bit-manipulation]
看错题目了,一位是求范围内异或。若是求范围内与 就是两个数字的最大相同前缀
-
202.快乐数 [hash-table , math]
没有比较好的思路,由题意可易证,结果一定不会到达无穷,所以试试暴力 用set判断是否循环,感觉效果还行。看了答案,惊呼此处可以用快慢指针来检测是否会出现循环。第三种方法是打表,记录会出现快乐数的一些中间值。
-
204.计数质数 [hash-table , math]
质因数经典题了,用埃拉托色尼筛选法 其原理也十分易懂:从1到n遍历,假设当前遍历到m,则把所有小于n的、且是m的倍数的整数标为和数;
-
205.同构字符串 [hash-table]
不需要两个哈希表,用一个数组的空间就可以做到一一对应,系列题目890.查找和替换模式
-
206.反转链表 [linked-list]
-
207.课程表 [depth-first-search , breadth-first-search , graph , topological-sort]
跟210一样的拓扑排序
-
208.实现-trie-前缀树.cpp [design , trie]
前缀树典型应用
-
209.长度最小的子数组 [array , two- pointers , binary- search , sliding-window]
滑动窗口时间复杂度为O(n),前缀和的二分可以做到 log(n)
-
210.课程表-ii [depth-first-search , breadth-first-search , graph , topological-sort]
经典拓扑排序问题 dfs 注意判断是否有环
-
213.打家劫舍-ii [dynamic-programming]
198.打家劫舍加了个头尾相连的限制条件,如果直接做213会比较困难
-
215.数组中的第k个最大元素 [divide-and-conquer , heap]
类似378.有序矩阵中第-k-小的元素 可以试试修改快排来做,堆排 优先队列也可 TOP K问题 先考虑堆的做法
-
220.存在重复元素-iii [sort , ordered-map]
用排序sort做,每添加一个新元素就对原有元素左右相减 窗口遍历过程中 若出现重复必定true
-
221.最大正方形 [dynamic-programming]
整错了,以为用dfs,居然使用动态规划做。🐂 转移方程参考1277. 统计全为 1 的正方形子矩阵 小学奥赛题。
-
226.翻转二叉树 [tree , depth-first-search]
-
230.二叉搜索树中第k小的元素 [binary-search , tree]
二叉搜索树 经常会和中序遍历 (恰节点元素正序) 串联。
-
231.2-的幂 [math , bit-manipulation]
-
234.回文链表 [linked-list , two-pointers]
找中点回文对比 效果巨差 写的还心累。不如直接放到数组中做。正确做法是 翻转后半段链表对比。
-
236.二叉树的最近公共祖先 [tree]
直接dfs查找节点 对比其路径 效果比较差。高效方法是递归左右子树对比。
-
238.除自身以外数组的乘积 [array]
类似双指针的思路 统计前后缀和即可
-
239.滑动窗口最大值 [heap , sliding-window]
用 multiset 速度慢,堆的话 元素为pair对应元素和下标 以免top元素不符合条件需要弹出。 单调队列 使用deque 比较难想到 效果不错。
-
240.搜索二维矩阵-ii [array , binary-search , divide-and-conquer]
相关题目74.搜索二维矩阵 一般的做法就是z字查询 或者二维二分
没想到 官方的Z字寻找 时间复杂度 O(n*m) 跑出来效果比二维二分好。可能是样本数据量大部分比较小 这个二维效果不太好。
-
241.为运算表达式设计优先级 [divide-and-conquer]
分治递归回溯一遍即可,官方的题解太复杂了,抄了个简易的写法
-
242.有效的字母异位词 [hash-table , sort]
-
256.粉刷房子 [dynamic-programming]
Plus题,映射剑指 Offer II 091. 粉刷房子 - 力扣(LeetCode)
-
258.各位相加.cpp [math]
O(1)的方法是真的难想到
-
260.只出现一次的数字-iii [bit-manipulation]
妙不可言,🐂的 利用遍历全部数组的N,将vector区分为两组
-
263.丑数 [math]
系列题目 264、265、313.超级丑数
-
264.丑数II [math , dynamic-programming , heap]]
直接用两个容器动态规划会超时,需要优化。也可以使用堆(优先队列)
-
269.火星字典 [unknow]
plus题 这个拓扑排序进阶 写的不好 看看官方的吧
-
279.完全平方数 [math , dynamic-programming , breadth-first-search]
使用动态规划 bfs皆可 贪心结果不一定正确。
-
283.移动零 [array , two-pointers]
思路是双指针,但是写的不好,看看其他人写的吧
-
285.二叉树的中序后继 [tree]
恶心人的plus会员题
-
287.寻找重复数 [array , two-pointers , binary-search]
采用448一样的做法修改原数组来记录遍历 最后还原回去即可
-
290.单词规律 [hash-table]
不得不说 c++没有 split 不太方便,用c字符指针的 strtok不优雅。相关题目205.同构字符串
-
297.二叉树的序列化与反序列化 [tree , design]
用中序代码很累赘 用dfs好看些, 注意题中是先使用 自定义的反序列化生成string 再序列化成树。所以为了便于转化 生成的string 可以不为[1,23,45,null] 这类格式。
-
300.最长递增子序列 [dynamic-programming]
动态规划 二分(牛的) 都可,直接看进接题的做法673.最长递增子序列的个数
-
301.删除无效的括号 [depth-first-search , breadth-first-search]
常规回溯 加上左右括号的判断。题目中描述使用最少删除 那么应该优先使用bfs
-
304.二维区域和检索-矩阵不可变 [dynamic-programming]
使用动态规划 构建一个二维前缀数组即可 官方的题解一维前缀也不错。
-
306.累加数 [backtracking]
基础的回溯做法,但是要考虑的细节比较多 思路就是 整个累加数列的值由前面 第1 2项目决定,所以只需对前两个回溯,后面的值只需要递归判断。注意题目中的 ‘0’ 开头的数字必为0 还有输入数字个数会小于3等问题。过大的数字可以用long限定17位等来做。有位大佬使用 long double 来做,代码很简洁。
-
309.最佳买卖股票时机含冷冻期 [dynamic-programming]
我是个彩笔 动态规划 还是不会 想不出转移方程先用暴力递归找规律
-
310.最小高度树 [breadth-first-search , graph]
证明比较复杂,直接记结论好了。
dfs法1:随机选取1点p,找出p最长路径的终点x(有重复任取1点),以x为最长的路径的终点y(有重复任取1点)。最小高度树的根即为 xy 的中点 1 个 或 2 个。
bfs法2:将所有度为1的节点删除,不断重复后,最后只剩度为1的节点即为最小数的根
-
312.戳气球 [divide-and-conquer , dynamic-programming]
区间动态规划,想不到啊 太菜了 分治法也能做 反着思考 添加气球(戳爆最后一个气球) 时间复杂度 O(n^3)
-
313.超级丑数 [math , heap]
题目264的升级做法,使用官方的优先队列会超时??
-
318.最大单词长度乘积 [bit-manipulation]
位运算制作字母匹配表 确保是存在相同字母,优化方法是使用 hashmap 记录所有相同字母的 免去重复计算。
-
322.零钱兑换 [dynamic-programming]
还记得是来实验室做的第一道动态规划 梦开始的地方 经典,此题即为完全01背包问题 变形
-
324.摆动排序-ii [sort]
其他做法 证明较难,没掌握。直接sort 加o(n) 遍历效果还行。
-
329.矩阵中的最长递增路径 [depth-first-search , topological-sort , memoization]
直接dfs遍历即可 注意标记去重。
-
332.重新安排行程 [depth-first-search , graph]
map对string key排序默认为字典序 结合dfs 回溯即可解答
-
334.递增的三元子序列 [unknow]
把问题想的过于简单了。。。 其实只要思路 如此也很快解决:贪心遍历 维护 三元中的最小值 中值
-
337.打家劫舍-iii [tree , depth-first-search]
又是一道打家劫舍,此处是反向的动态规划 和 深度遍历。直接dfs会超时 用动态规划的思想 或 hashmap 做后序遍历。
-
338.比特位计数 [dynamic-programming , bit-manipulation]
可以采用动态规划或是位运算的方法 只扫一遍 队列计算出答案
-
343.整数拆分 [math , dynamic-programming]
基本的动态规划
-
344.反转字符串 [two-pointers , string]
-
346.数据流中的移动平均值 [queue]
plus会员题… 映射至 剑指 Offer II 041. 滑动窗口的平均值
-
347.前-k-个高频元素 [hash-table , heap]
这里优先队列的pair 重载运算符比较麻烦,所以重载了() 的mycmp。
-
349.两个数组的交集 [hash-table , two-points , binary-search]
-
350.两个数组的交集-ii [hash-table , two-points , binary-search]
-
371.两整数之和 [bit-manipulation]
很有意思的题目 哈哈 不用加法算加法 使用位运算 。
由于计算机中处理 负数使用补码 所以无论正负数 相加 都可以用 普通正数加法来做处理 需要注意负数的位置溢出 在 C++ 的实现中,当我们赋给带符号类型一个超出它表示范围的值时,结果是 undefined;而当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模的余数。因此,我们可以使用无符号类型来防止溢出报错。
-
373.查找和最小的k对数字 [heap]
264.丑数II有类似做法。此题先找前k对,因为最小值必然只会找到数组的前 min(k, size) 个元素,之后用堆 set去重。注意pair无法直接用于unordered_set,需要传入哈希函数。另一种做法是直接
set<tuple<int, int, int>> s;
做排序去重 -
377.组合总和-ⅳ [dynamic-programming]
多重背包问题 变形 ,和硬币换算类似。把i j 遍历元素一换 就是求所有子序列的值(顺序不同视作统一序列)
-
378.有序矩阵中第-k-小的元素 [binary-search , heap]
最优解是二分法,当然也可使用优先队列(较差) 归并(最差)也可。类似 215.数组中的第k个最大元素
-
380.o-1-时间插入、删除和获取随机元素 [array , hash-table , design]
srand的正确用法,非常有意思,vector map结合
-
382.链表随机节点 [reservoir-sampling]
水塘抽样问题 妙不可言 有空多复习
-
384.打乱数组 [unknow]
一道随机题目,让我想到 全排列 题目的挑选方案,每次从未挑选元素中寻找添加到确定元素中,此处做法直接是放到数组尾端。
-
385.迷你语法分析器 [string , stack]
没找规律 就硬做递归 写的不好。用该特殊类做stack做遍历判断。
-
386.字典序排数 [unknow]
找规律直接遍历生成字典序即可,规律为 默认*10 否则/10 到+1 不会进位或超出即可
-
388.文件的最长绝对路径 [unknow]
理解错题意,只有路劲包含. 代表是文件
-
393.utf-8-编码验证 [bit-manipulation]
就硬解,考虑的东西还蛮多的。 注意4字节上限不是1FFFFF 是10FFFF 题目有问题,没有考虑其unicode码不在取值范围内
-
394.字符串解码 [stack , depth-first-search]
纯恶心人,逻辑题 没啥意思
-
395.至少有-k-个重复字符的最长子串 [sliding-window , divide-and-conquer ]
没想出来怎么做,题解的分治 和 滑动窗口 牛的
-
396.旋转函数 [math]
找规律即可,求出前缀和即可解决
-
399.除法求值 [union-find , graph]
题不难,但是写起来很累
-
406.根据身高重建队列 [greedy]
妙啊,一次排序就可做出。建议二刷
-
409.最长回文串 [hash-table]
-
410.分割数组的最大值 [binary-search , dynamic-programming]
又是一道二分最优解 动态规划也可
-
413.等差数列划分 [math , dynamic-programming]
-
415.字符串相加 [string]
做这个题让我想起以前本科做的单片机计算器
-
416.分割等和子集 [dynamic-programming]
进接题目为 494.目标和.cpp
-
421.数组中两个数的最大异或值 [bit-manipulation , trie]
使用位运算效果一般 常规方法还是前缀树 每个节点的深度都为31,这里关键点在于数字是反向的填入即从高位到低位的填入树中。异或过程即找反向的树,不存在就转为跟当前树同向。
-
429.n-叉树的层序遍历 [unknow]
二叉树的层次遍历bfs的稍变形
-
430.扁平化多级双向链表 [list , depth-first-search]
做的时候一直认为感觉像是链表的深度遍历,多了些链表的切换操作,注意操作时先判断是否为空 这里被坑了下
-
435.无重叠区间 [greedy]
贪心 先按照区间首元素排序后 遍历有重合时删除 尾部更长的 降低后续的区间重复的可能
-
437.路径总和-iii [tree]
直接穷举遍历 显然会很慢,优化:用map做前缀和记录 遍历 560.和为-k-的子数组 进阶
-
438.找到字符串中所有字母异位词 [hash-table , sliding-window]
典型的滑动窗口,难度适中。类似题目209
-
440.字典序的第k小数字 [unknow]
以字典树的思想分层查找
-
444.序列重建 [unknow]
拓扑排序进接题 此处优化方案为 mp 是字典记录每个 1~n 在 org 中的下标,表示字典 mp[1~n]=0~n-1。若 mp 唯一存在 必定 seqs 所有相邻节点都存在 以此来判断唯一
-
445.两数相加-ii [linked-list]
写的很shit 直接stack 反向加,其他做法是转成string 两数相加
-
448.找到所有数组中消失的数字 [array]
有意思,不使用额外空间就只能对原数组标记更改 遍历过的值将值换为对应下标标记为负数 类似题287.寻找重复数
-
450.删除二叉搜索树中的节点 [tree]
注意 节点 释放内存 需要把上层节点的指向 子树指针 置空。写遍历写成一坨shit。。。 建议二刷
-
451.根据字符出现频率排序 [hash-table , heap]
桶排序效果也不错
-
460.lfu-缓存 [design]
经典 缓存机制设计 另一个 LRU缓存
-
461.汉明距离 [bit-manipulation]
-
464.我能赢吗 [dynamic-programming , minimax]
292.nim-游戏的扩展,一道很经典的博弈题,动态规划
-
473.火柴拼正方形.cpp [depth-first-search , dynamic-programming]
698题的退化版本 动规 dfs皆可。
-
478.在圆内随机生成点 [rand]
法1使用拒绝采样方式在正方形内裁出圆形
法2计算概率密度函数 朴素做法 直接用半径的等分会错 会导致 圆心更容易被选中
-
479.最大回文数乘积 [unknow]
暴力枚举 的hard题 绝了,还是打表🐂
-
494.目标和 [dynamic-programming , depth-first-search]
动态规划的转移式难想到,此题数据规模小 直接哈希打表记录勉强能过。
-
497.非重叠矩形中的随机点 [rand]
以面积做二分查找,权值加权做随机值 确定里面随机一点,注意此处面积包含四周所以 点数为 (长+1) * (宽+1)
-
498.对角线遍历 [unknow]
直接模拟遍历一遍,判断条件写的较丑
-
508.出现次数最多的子树元素和 [hash-table , tree]
典型dfs题
-
513.找树左下角的值 [tree , depth-first-search , breadth-first-search]
199.二叉树的右视图 进阶题,dfs不太好想
-
515. 在每个树行中找最大值 [tree , depth-first-search , breadth-first-search]
同513 dfs的话就是每一个深度的放一个下标 每次到达相同深度 取最大值即可 推荐bfs
-
516.最长回文子序列 [dynamic-programming]
5.最长回文子串扩展,这个动态规划可以压缩为一维的做优化。不过能ac就行,没必要为了这点空间做优化。
-
518.零钱兑换-ii [dynamic-programming]
完全背包变种
-
521.最长特殊序列-i [string]
把题目理解错了… 好好反思这种都能错
-
522.最长特殊序列-ii [string]
没啥好办法,排序后暴力穷举
-
525.连续数组 [hash-table]
与 560.和为-k-的子数组 类似,使用前缀和的哈希表
-
528.按权重随机选择 [unknow]
生成随机数 二分查前缀
-
532.数组中的-k-diff-数对 [array , two-pointers]
set典型应用,注意添加数可能为 nums[i] + - k
-
535.tiny-url-的加密与解密.cpp [hash-table , math]
这题没限制直接return原串也行,逆天
-
537.复数乘法 [math , string]
写起来不太舒服,sscanf sprintf 格式化的做法,答案用正则表达式 查字符 切割字符(split=>strtok)皆可
-
538.把二叉搜索树转换为累加树 [tree]
与 1038.从二叉搜索树到更大和树 相同, 先序创节点,中序填入节点即可。或者算出全部节点和后 中序直接在节点上修改。
-
539.最小时间差 [string]
用哈希去重后 直接枚举找最小值
-
540.有序数组中的单一元素 [binary-search , bit-manipulation]
忘记了题目中声明数组为有序 依此二分,要对奇数位区分判断是否为成对的数 (情人节的每日一题,来自制作者的恶意)
-
541.反转字符串-ii [string]
-
542.01-矩阵.cpp [depth-first-search , breadth-first-search]
此题用bfs扫描感觉比较好,dfs写不出来。答案的动态规划 想不到..
-
543.二叉树的直径 [tree]
和 进阶题 124.二叉树中的最大路径和 一样的思路
-
547.省份数量 [depth-first-search , union-find]
经典的并查集问题,注意路径压缩与按秩归并。使用dfs bfs注意剪枝否则效果差
-
553.最优除法 [math , string , dynamic-programming]
考虑到题中确定所有数大于等于2 那结果必然就只有一种。若是没有这个限制就用动态规划,还得考虑字符串,很困难。
-
556.下一个更大元素-iii [string]
全排列,这个处理数字溢出的部分让我想起联发科笔试的痛苦回忆。。。
-
557.反转字符串中的单词-iii [string]
-
558.四叉树交集 [unknow]
理解题意即可
-
560.和为-k-的子数组 [array , hash-table]
nums[i] 包含0 边界处理很棘手 且有正有负 说明滑动窗口不可行。使用前缀和 map记录查询很好 学到新活!
-
565.数组嵌套 [array]
按照题意 set 遍历一遍,递归查找。效果很差。看了下 官解 方法1跟我一样不过没用递归,方法二使用原地标记。看来深度过大的递归时间消耗会很大。。。
-
567.字符串的排列 [two-pointers , sliding-window]
滑动窗口 字符串题 类似题有 438.找到字符串中所有字母异位词.cpp
-
572.另一棵树的子树 [tree]
dfs做的话没啥难度,关键在于 前序遍历数组kmp对比 树哈希做法(字节面试)
-
581.最短无序连续子数组 [array]
单调栈的思路是想复杂了 官方这样反着遍历一次出答案难想到
-
583.两个字符串的删除操作 [string , dynamic-programming]
相关题目1143.最长公共子序列
-
592.分数加减运算 [math]
按照数学通分公式做即可,最后求分子分母的最大公因数来约分。有点意思。
-
593.有效的正方形 [math]
题不难 坑略多,要判断 是否重合 边长相等 角度正交 四点坐标三种情况。用向量来做,即为 向量xy不能全为0,向量模相等,向量积为0。
-
599.两个列表的最小索引总和 [hash-table]
哈希表典型应用
-
605.种花问题 [array]
vivo面试题
-
617.合并二叉树 [tree]
-
621.任务调度器 [array , greedy , queue]
先取出并以出现次数频率作为排序依据,解题需要穷举几次发现规律,比较难想到
-
622.设计循环队列 [queue]
循环队列 可以用一个固定长度的vector来实现
-
623.在二叉树中增加一行 [tree , dfs]
dfs的应用,一定按照题意对 depth-1 行操作,吃了这个亏花了很长时间才发现题目理解错了,添加的那行树的左右子树顺序是有要求的
-
632.最小区间 [hash-table , two-pointers , string]
想不出来。。 看了题解 能用堆做,仿着答案做了个自己理解的。此题关键在于 该问题可以转化为,从 k 个列表中各取一个数,使得这 k 个数中的最大值与最小值的差最小。
-
636.函数的独占时间 [stack]
计算函数占用时间 注意结束时间要加一 剩下的就是字符处理 stack 记录递归了。
-
640.求解方程 [math]
傻X题目,面向案例编程 居然会有 0X=0X 这种输入 坑很多 题目写的一堆 if else shit一样的代码
-
641.设计循环双端队列 [dequeue]
手写双向链表 很多坑 麻烦啊
-
646.最长数对链 [dynamic-programming]
注意题中没说明 链在原pairs中必须连续。所以先按照首元素大小排序 确保遍历顺序正确
-
647.回文子串 [string , dynamic-programming]
与 5.最长回文子串 一样
-
648.单词替换 [hash-table , trie]
前缀树 相关题目 析构函数不写可以提升速度😂
-
652.寻找重复的子树 [tree]
注意这里的先序转字符串加入特殊符号即可保证 答案唯一性。
-
653.两数之和-iv-输入-bst.cpp [tree]
搜索树中序遍历比较大小 set查询是否存在
-
654.最大二叉树 [tree]
-
655.输出二叉树 [tree]
-
658.找到-k-个最接近的元素 [binary-search]
双指针基础应用 初始值用二分找
-
662.二叉树最大宽度 [tree]
注意直接用 完全二叉树的标号会越界 每层都要修改id
-
667.优美的排列-ii [array]
理解题意即可 找出规律
-
669.修剪二叉搜索树 [tree]
理解题意 递归即可
-
670.最大交换 [array , math]
-
672.灯泡开关-ⅱ [math]
脑经急转弯了,可以推导出公式 想不到。
-
673.最长递增子序列的个数 [dynamic-programming]
300.最长递增子序列 进阶题,常规做法 :维护一个 dp[i] 为 以i为起点(一定包含i)到达尾部的最大递增子序列长度 first 以及其个数 second 的数组做动态规划,还有 贪心二分 做法(妙)。
-
676.实现一个魔法字典 [hash-table , trie]
前缀树 进阶题
-
677.键值映射 [trie]
前缀树常规题 记得初始化 该树初始值
-
680.验证回文字符串-ⅱ [string]
-
684.冗余连接 [tree , union-find , graph]
并查集基础应用
-
687.最长同值路径 [tree , recursion]
大意了,居然写了个双重递归 判断值不需要传参给子节点 父节点自己进行判断即可 还要注意计算个数的时候 需要两边都要加节点
-
688.马-在棋盘上的概率 [dynamic-programming]
动态规划,维护一个 n*n dp容器记录每个位置的成功概率。进行k次遍历更新dp每个格子的概率,其每个格子的当前概率为对应8个方向的格子上一次遍历概率。若是第一次进行遍历则格子对应初始概率为1.0。
-
693.交替位二进制数 [bit-manipulation]
-
695.岛屿的最大面积 [array , depth-first-search]
-
698.划分为k个相等的子集 [dynamic-programming , recursion]
直接递归会超时, 使用状态dp来做 妙啊
-
703.数据流中的第-k-大元素 [heap]
少用 make_heap 要注意的东西太多了
-
705.设计哈希集合 [Unknown]
有意思,设计list容器。list使用std就好,自己写要维护链表头尾比较麻烦。
-
706.设计哈希映射 [Unknown]
list链表数组
-
707.设计链表 [Unknown]
设计 链表 使用单向链表 需要虚拟头 使用双向链表 需要虚拟头、尾
二刷 双向链表的实现 太多细节要考虑了 折磨
-
708.循环有序链表 [link-list]
原题要会员就离谱 替代品: 剑指 Offer II 029. 排序的循环链表
-
710.黑名单中的随机数 [rand]
随机数的有意思题,注意不可直接 遍历做映射很慢,只需要对在左区间内为黑名单的值映射到右区间即可。
-
713.乘积小于k的子数组 [array , two-pointers , sliding-window]
这个滑动窗口要考虑到子数组如何计算和缩减的问题,不妨假设窗口遍历时前面的子数组统计完备,那之后的子数据计入必需包含右边界则可以很容器的解决该问题。
-
715.range-模块 [segment-tree , ordered-map]
线段树 官解用map也可,这里推荐用 珂朵莉树(Chtholly Tree)
-
717.1-比特与-2-比特字符.cpp [array]
推敲下,确定一个数组排序唯一。顺序遍历的判断即可,官方答案的逆序做法不错,想不到!
-
724.寻找数组的中心下标 [array]
简单前缀和应用
-
729.我的日程安排表-i [array]
用有序map二分查来做,之后的做法类似56.合并区间 要注意map下标没有重载+- 必须再创一个变量。还有线段树的做法 学不来。
-
730.统计不同回文子序列 [string , dynamic-programming]
这。。。 还要去重 实在想不出怎么动规 看官解
-
731.我的日程安排表-ii [ordered-map]
有序map 新题型,学到了。使用 map 记录边界次数 左边界+1 右边界-1 这样遍历map时 某一段second和出现 大于 2 就代表同时出现三个及以上区间叠加。
-
735.行星碰撞 [stack]
用数组构造栈,好活
-
738.单调递增的数字 [greedy]
找规律后贪心即可,一开始居然打算用dfs 回溯做。
-
739.每日温度 [hash-table , stack]
单调栈理解不透彻 写成这个样子 答案是正向遍历 绝了 需要二刷
-
741.摘樱桃 [dynamic-programming]
记忆化搜索 动态规划皆可, 注意的是要将题意转化为两个人同时出发。妙啊
-
745.前缀和后缀搜索 [binary-search]
直接暴力穷举也可以,官方采用字典树的方法,将前缀后缀拼接在一起 比较权重。绝了。
-
746.使用最小花费爬楼梯 [trie , dynamic-programming]
-
747.至少是其他数字两倍的最大数 [array , dynamic-programming]
-
748.最短补全词 [array]
-
752.打开转盘锁 [bit-manipulation]
状态不好,写的很差 切记 这种题 用bfs 才能正确 否则dfs后面到达 中间值数字可能 花的步数更少 导致结果偏大
-
763.划分字母区间 [string , recursion]
自己做是贪心的维护了一个数组map 记录每个字符所在区间的左界下标,最后遍历一遍出的答案。官方的答案是维护右界。。少进行一次遍历。
-
779.第k个语法符号 [array]
找规律即可
-
784.字母大小写全排列 [ordered-map]
-
785.判断二分图 [graph , stack]
直接用两个set遍历记录,之前报错老是忘了 有可能没有遍历扩散到的节点。官方直接用一个数组记录即可,并查集也能做。
-
788.旋转数字 [depth-first-search]
-
792.匹配子序列的单词数 [binary-search]
用桶区分 每次遍历 array来划分 妙啊
-
797.所有可能的路径 [math , depth-first-search]
dfs回溯减枝
-
798.得分最高的最小轮调 [math , array]
差分数组 很难区分区间越界 答案用取余 妙
-
814.二叉树剪枝 [tree , depth-first-search]
有时不必急着delete内存,也许测试案例给的是 局部变量非new的堆空间 不需要delete (delete会报错)
-
817.链表组件 [hash-table , design]
太久没写了 还是生疏了
-
820.单词的压缩编码 [depth-first-search , graph , trie]
直接 哈希表 删同后缀字符长度 比前缀树 好写多了 效果还好。
-
821.字符的最短距离 [union-find]
遍历两遍 第一遍记录特定字符位置。想节约空间的话 将这两步合并。
-
829.连续整数求和 [math , hash-table]
等差数列 技巧题 双指针在 10^9 这个数量级别 双指针肯定会超时
-
838.推多米诺 [linked-list , design]
走弯路了,看完官方 豁然开朗。模拟多米诺 只要找中间全为竖立状态的 进行判断:
若骨牌同向 此区间全为该方向
若骨牌反向 此区间向中间倒
若骨牌背向 此区间不变
-
839.相似字符串组 [union-find]
所有 单词都是 异位词 则相似即为 字符串两个字符不同。通过遍历判断相似 得出 edage 进行并查集 分组 此处可以不用路径压缩
-
841.钥匙和房间 [depth-first-search]
-
844.比较含退格的字符串 [stack , two-pointers]
用双指针写的很烦,像shit一样,用栈写非常香。
-
852.山脉数组的峰顶索引 [array , binary-search]
-
857.雇佣-k-名工人的最低成本 [greedy , array , heap]
资本家最喜欢的题了 属于是 很难想到计算的公式 看题解
-
863.二叉树中所有距离为-k-的结点 [tree , depth-first-search]
常规递归加上父节点递归 三个方向即可,写起来有点麻烦,后面第二次查可以用set以免重复或者 记录该节点父节点即可。
-
873.最长的斐波那契子序列的长度 [minimax , dynamic-programming]
一开始想简单了,以为可以只用 dp[i] 的形式记录所有数据。最后的序列得需要 至少两个元素才可,用记录 斐波那契 序列的最后两位可以节省时间。还是官方的言简意赅。压缩到一维的map中。
-
875.爱吃香蕉的珂珂 [two-pointers]
二分扩展题,小技巧 a>0 时 a / b 向上取余 => (a + b -1 ) / b;
-
876.链表的中间结点 [ordered-map , linked-list , two-pointers]
注意题中输出要求,使用双指针做
-
887.鸡蛋掉落 [heap]
双蛋问题,google经典面试题,2020 vivo提前批。第一次做思路出了问题,解决部分。这道题常规做法用到 二分法 + 动态规划。官方解法3的逆向思维可以了解下。
-
889.根据前序和后序遍历构造二叉树 [string , tree]
先回顾二叉树前中后序列区别,注意题中说明 二叉树中的各个值不相同,不需要考虑不成立的情况
-
890.查找和替换模式 [greedy]
题目205、类似做法直接双重映射或者单重映射搭配数组记录次数,(单重映射只能保证一对多,不能一一对应)
第一次做时打算用个数来做少考虑了部分情况。直接用数组下标做映射也是可以的(推荐)
-
891.子序列宽度之和 [greedy]
有难度,找公式。
-
897.递增顺序搜索树 [math]
官方解是直接改原链表指向。是否原地修改 看情况而定
-
899.有序队列 [math]
找规律的脑经急转弯,有意思。
-
917.仅仅反转字母 [two-pointers , greedy]
双指针简单应用 判断是否为字符使用 isalpha()
-
919.完全二叉树插入器 [math , queue]
层序遍历 补充父节点队列即可
-
925.长按键入 [tree]
第一次写的很烂,思路跟答案差不多,很多情况没考虑到。
-
926.将字符串翻转到单调递增 [string]
做标记 记录从那个位置全为1即可解出
-
933.最近的请求次数 [tree , depth-first-search]
网络仿真软件的事件也是如此实现,按照时间顺序push入事件队列 处理事件。
-
946.验证栈序列 [math , greedy]
最近笔试倒是经常做验证栈的题 有意思
-
952.按公因数计算最大组件大小 [math , unionfind]
好难 想不到要用因数 并查集的思路 了解下吧。
-
953.验证外星语词典 [string]
-
969.煎饼排序 [queue]
直觉做的方案效果还不错,直接暴力的迭代对当前最大的数转置
-
973.最接近原点的-k-个点 [string , greedy]
实现想不到啥好方法,直接暴力排序看看居然ac了。仔细想想用堆排序应该更好些
-
986.区间列表的交集 [math , two-points]
虽然题目简单,但是写的不好 太慢了
-
997.找到小镇的法官 [graph]
理解题意即可 注意 空数组边界。本质上是图论题目的出度 入度
-
998.最大二叉树-ii [tree]
弱智语文题 。。。
-
1006.笨阶乘 [hash-table , string]
-
1024.视频拼接 [greedy , dynamic-programming]
-
1037.有效的回旋镖 [greedy , sliding-window]
类似 149.直线上最多的点数 的做法 此处数据量较小 用乘法相比做斜率不错
-
1038.从二叉搜索树到更大和树 [math , backtracking , graph]
与538.把二叉搜索树转换为累加树 相同
-
1048.最长字符串链 [math , string]
直接暴力模拟,将不同长度的string 划分不同的数组中,计算并记录 其与长度减一的字符串是否匹配。
-
1051.高度检查器 [dynamic-programming , greedy]
-
1089.复写零 [Unknown]
为了不用额外空间需要使用二指针,反向遍历一遍。傻的一批,直接复制个副本不香么。
-
1091.二进制矩阵中的最短路径 [depth-first-search , breadth-first-search]
dfs容易超时,找寻一个解或答案时bfs有效,比较全部路径时一般用dfs更好 ,这题还要注意起点会有坑…
bfs只要找到路就可以return 最先找到的必定等于最短值, 标记走过的路直接赋值原数组1 (bfs,dfs少用set)
-
1108.ip-地址无效化 [string]
-
1111.有效括号的嵌套深度 [dynamic-programming]
第一想法就是用栈做,没想到这题也可以动态规划
-
1122.数组的相对排序 [array , sort]
-
1143.最长公共子序列 [dynamic-programming]
典型二维动态规划 等价题目583.两个字符串的删除操作 二刷还是忘 艹🤡 涉及两个变量都相关的 转移方程 一般
dp[i][j] 与 dp[i-1][j-1] 相关
相关题目 115.不同的子序列 -
1161.最大层内元素和 [breadth-first-search]
-
1163.按字典序排在最后的子串 [Unknown]
思路容易想到,就是实现时总是忘考虑各种情况。容易知道ans的头一定为string中最大的元素,设计两个string 一个为输出的答案。一个为遍历过程中string缓存ans1,出现当前字符最大值后,迭代的与ans比较来确定该ans1是补上ans还是重新定义为ans。
-
1175.质数排列 [Unknown]
一道质数相关题目,求阶乘即可
-
1200.最小绝对差 [sort]
-
1206.设计跳表 [Unknown]
redis zset 跳表的实现 了解即可 以防面试等通知。。
-
1217.玩筹码 [Unknown]
-
1220.统计元音字母序列的数目 [dynamic-programming]
这个找规律 蛮有意思的
-
1249.移除无效的括号 [stack]
基本应用栈
-
1252.奇数值单元格的数目 [Unknown]
进阶法也只是扫描一次行与列即可,因为只要记录奇偶数即可。
-
1260.二维网格迁移 [Unknown]
题目不难直接模拟即可,写起来很麻烦。tnnd 直接一维展开简单多了。
-
1282.用户分组 [Unknown]
-
1302.层数最深叶子节点的和 [tree]
-
1331.数组序号转换 [sort]
sort应用,稍微改下就是树状数组来做了。
-
1332.删除回文子序列 [Unknown]
想复杂了,注意题目中删除回文字符串不一定为连续。给的案例拿来误导的。
-
1353.最多可以参加的会议数目 [Unknown]
贪心优先队列,算是应用题了
-
1374.生成每种字符都是奇数个的字符串 [string]
-
1403.非递增顺序的最小子序列 [Unknown]
-
1405.最长快乐字符串 [greedy]
题目不难 贪心也好想到 就是写成代码不好写 还是得多练啊 看了官方的答案才知道怎么写。
-
1408.数组中的字符串匹配 [Unknown]
直接暴力 map查居然可以
-
1413.逐步求和得到正数的最小值 [greedy]
-
1416.恢复数组 [dynamic-programming]
边界处理要小心,为了节约判断直接用longlong吧,注意数字过长需要提前退出。
-
1417.重新格式化字符串 [Unknown]
-
1422.分割字符串的最大得分 [Unknown]
-
1450.在既定时间做作业的学生人数 [Unknown]
-
1455.检查单词是否为句中其他单词的前缀 [string]
-
1460.通过翻转子数组使两个数组相等 [Unknown]
-
1464.数组中两元素的最大乘积 [sort]
-
1470.重新排列数组 [two-pointers]
-
1475.商品折扣后的最终价格 [Unknown]
-
1557.可以到达所有点的最少点数目 [graph]
简单问题复杂化了,属于是
-
1568.使陆地分离的最少天数 [Unknown]
脑经急转弯。。
-
1582.二进制矩阵中的特殊位置 [Unknown]
-
1592.重新排列单词间的空格 [Unknown]
-
1594.矩阵的最大非负积 [Unknown]
万能的DP
-
1598.文件夹操作日志搜集器 [Unknown]
-
1608.特殊数组的特征值 [Unknown]
降序排序后好些 正序写的啥呀。。。
-
1619.删除某些元素后的数组均值 [Unknown]
-
1624.两个相同字符之间的最长子字符串 [Unknown]
-
1629.按键持续时间最长的键 [Unknown]
-
1636.按照频率将数组升序排序 [Unknown]
-
1640.能否连接形成数组.cpp [Unknown]
没看到题目说所有数字不一样 直接用哈希来做直接遍历判断 暴力dfs写的很麻烦
-
1652.拆炸弹 [Unknown]
-
1656.设计有序流 [Unknown]
理解题意即可
-
1664.生成平衡数组的方案数 [Unknown]
-
1706.球会落何处 [Unknown]
让我想到了多米诺题目,也是左右判断是否停止。
-
1716.计算力扣银行的钱 [Unknown]
-
1791.找出星型图的中心节点 [Unknown]
-
1823.找出游戏的获胜者 [Unknown]
想不出好方法,直接拿链表硬做的。约瑟夫环问题
-
1935.可以输入的最大单词数 [Unknown]
注意边界和最后一个单词
-
1953.你可以工作的最大周数 [Unknown]
-
2016.增量元素之间的最大差值 [Unknown]
一开始想着用堆做导致问题后面解析复杂了。只需要维护一个前缀即可
-
2024.考试的最大困扰度 [sliding-window]
滑动窗口题,被自己蠢到了,居然遍历左边界 而不滑动窗口里来满足k
-
2034.股票价格波动 [Unknown]
很有意思的题 结构设计 注意multiset erase 的坑,有条件尽量用无序的来做
-
2038.如果相邻两个颜色均相同则删除当前颜色 [Unknown]
-
2055.蜡烛之间的盘子 [binary-search]
二分题目真的是每次都会在边界问题上卡好久,还是得多练。将盘子前缀记录在数组中,然后二分的查相减即可
-
2100.适合打劫银行的日子 [dynamic-programming , two-pointers]
望文生义,直接找出并记录所有满足时间的长度递减和递增下标 重合时间下标即为适合打劫的日子,省时间费空间 注意,time可以为0, 所以建立下标时要考虑
i==0 i==size-1
看看官方的动态规划 和 大佬的双指针(推荐) -
2104.子数组范围和 [stack , sliding-window]
直接暴力的滑动窗口 时间复杂度O(n^2) 容易超时,使用单调栈来做
-
2110.股票平滑下跌阶段的数目 [Unknown]
翻译题意就是求递减数列 并且求其等差数列和即可
-
2257.统计网格图中没有被保卫的格子数 [depth-first-search , breadth-first-search , graph]
暴力dfs居然能过,官解使用bfs 加状态法做。
关键
-
序列:
-
子序列元素相同并不代表是 同一子序列 ,只要子序列元素索引不同即为不同子序列,子集合 才是考虑元素不同(题目 891)
-
子序列 是不要求连续的 相对位置不变,而 子数组 和 子串 一样,是需要连续的
例如 12345678 的子序列 可以是 1345678 子数组 只能是 45678 之类的
-
-
二叉树:
-
前序/后序+中序序列可以唯一确定一棵二叉树,只知道前序和后序不唯一确定 参考 105.从前序与中序遍历序列构造二叉树 蓝桥杯例题 和 889.根据前序和后序遍历构造二叉树
-
创建树的模板 createTree 297.二叉树的序列化与反序列化
-
二叉搜索树使用中序遍历为 升序或者降序
-
-
链表题目注意:
- 舍得用变量,千万别想着节省变量,否则容易被逻辑绕晕
- head 有可能需要改动时,先增加一个 假head,返回的时候直接取 假head.next,这样就不需要为修改 head 增加一大堆逻辑了。
- 链表指针 使用 next prev 来做 ++ – 操作。
-
leetcode输入测试:
-
若是例如44.通配符匹配的类似多个string时外面还要加”“,例如输入
s="io" p="io*"
时,应该是输入""io"\n"io*""
即测试内容包含字符串 外面再包一个
""
类似的还有""***|**|*****|**||**|*"\n[[1,17]]\n"
-
非文件的话多个参数使用\n分隔,文件的话直接回车分行即可。
-
-
常用函数 表达式
- distance(first, last) 函数 求迭代器之间的距离 非随机访问迭代器 例如set map 事件复杂度为 O(n) 739.每日温度 此列题 用map 做下标查找二分下标
- 判断是否为字符使用 isalpha()
- C++ 科学计数法表达数字(double)
0.01 => 1e-2; 100 => 1e2;
- C++ std库实现的二分查找 lower_bound()返回第一个大于等于 upper_bound()返回第一个大于
- size() 返回值为无符号数,其与负数相比较时负数会转为无符号数,所以判断结果会出问题。一定要在判断前转为int。
-
顺序容器中关于 emplace_back 用法 还包含了vector 的 size reserver 的注意事项
-
找寻全部解时dfs效果比bfs效果好或者差不多,只需要一条路径或判断是否有效时 推荐bfs。bfs(队列) dfs(栈)的具体实现可采用递归 迭代,一般用递归好写点也好理解。dfs栈的状态如果会返回上次递归 则算法就是回溯。
-
Set map 相关
-
map set 的自定义比较函数 传函数 而不是类
-
multiset是元素可以重复的有序队列,非常好用,会自动排序队内元素。(set是不会出现元素重复的有序数组底层红黑树,所以元素无需排序时尽量hash实现的unordered_set)跟优先队列的区别,这个分析的不错 优先队列能否被set或multiset(c++语法)替换? - 知乎 (zhihu.com)
-
multiset erase 删除值时会将所有相等值删除,erase单个迭代器才是删单个元素。查询该值范围时可用 equal_range 返回一个pair 指向头 和末尾的后一个元素 erase输入两个迭代器删范围。
-
unordered_set 不能直接用pair做key,需要传入hash函数 例如下 参考1 参考2
struct SimpleHash { size_t operator()(const std::pair<int, int>& p) const { return hash<int>{}(p.first) ^ hash<int>{}(p.second); } }; unordered_set<pair<int, int>, SimpleHash> myset;
-
常见容器 vector queue stack 双端队列:deque 双向链表 list
-
C++ 类定义的函数方法要在类内使用 需要 static 修饰 举例 102行 此处的自定义比较函数一般使用匿名函数
-
C、C++格式化字符串 , Jacky Walker (wukongcoo1.github.io) 可以实现 前缀补0 等操作
-
在声明时可以不加 形参名,定义时再加。且在类内声明static函数,类外定义时不要加static 示例 (声明时需要告诉编译器这是什么类型, 但定义时, 编译器会自己找声明C++中有很多类似语法:比如, 默认参数列表, 是声明的时候加默认参数, 定义函数的时候不需要; 定义inline函数也是声明的时候加inline, 定义的时候不加
-
动态规划 背包问题总结:
- 常规 01 背包 i j 遍历 优化为1维 需要 j 逆序 i 为背包种类 j 为背包上限
- 多重 01 背包 i j k 遍历 优化为1维 需要 j 逆序 i 为背包种类 j 为背包上限 k为对应背包可以出现的个数
- 完全 01 背包 i j 遍历 优化为1维 需要 j 正序 i 为背包种类 j 为背包上限
- 完全背包归纳
-
-
Least Recently Used LRU对于循环出现的数据,缓存命中不高
比如,这样的数据,1,1,1,2,2,2,3,4,1,1,1,2,2,2…..
当走到3,4的时候,1,2会被淘汰掉,但是后面还有很多1,2
-
Least Frequently Used LFU对于交替出现的数据,缓存命中不高
比如,1,1,1,2,2,3,4,3,4,3,4,3,4,3,4,3,4……
由于前面被(1(3次),2(2次))3加入把2淘汰,4加入把3淘汰,3加入把4淘汰,然而3,4才是最需要缓存的,1去到了3次,谁也淘汰不了它了。
-
-
类内 sort 调用谓词函数报错 相关
出现sort() error: reference to non-static member function must be called 原因:sort()函数接受二元谓词,但是在类内定义的myCompare函数作为成员函数,实际上有三个参数,this指针、m、n。 解决方案:
- 将myCompare()函数挪到类定义的外面,即改为非成员函数;
- 将myCompare()函数定义为静态成员函数,没有this指针。
- 将myCompare()函数定义为类的友元函数,但是此时必须在类外声明该函数,否则,即使在类内定义了该友元函数,该函数仍然是不可见的。
-
随机值问题:
- 如何等概率地从n个数中随机抽出m个数?__牛客网 (nowcoder.com)
- 382.链表随机节点 无需注入srand随机种子
- rand使用方法 srand正确用法应该放在类的构造函数内,只初始化一次。