1.两数之和 EASY 8:30s 优化:可以边放哈希表边找 2.字母易位词分组 MIDDLE 初看无思路 7:23 优化:可以直接将map的value值传进答案中 3. 4.移动零 EASY 写复杂了,优化:学会使用swap 5.盛最多水的容器 MIDDLE 7:35s 优化:简单,但是写复杂了,多套了两个循环 6.三数之和 MIDDLE 12:34写了大概思路。卡在去重了【nSum问题,3Sum转换为2Sum,先总和筛,再去重,否则匹配值,匹配完还要再去重】 + 第二遍:去重过度了,注意是nums[i]!=nums[i+1] 7.接雨水 HARD : 不会做,但是看了题解后就秒杀了,很简单 8.无重复字符的最长子串MIDDLe,--18:30s。思路很简单,但是以为只有字母没用哈希表存 9.找到字符串中所有字母异位词Middle:12:00s
子串¶
子数组、子串:又称连续非空子序列
连续子串:前缀和,哈希表优化前缀和 复杂滑动窗口(动态集合维护最值):单调队列
10.和为K的子数组Middle--这玩意儿可以(负数+正数)抵消,滑动窗口根本没办法--要用到前缀和思想,一点儿思路没有。重做一遍,还是没思路,看了题解做出优化一共花了26:29的时间。 11.滑动窗口最大值Hard:不会做,23:21有点难度,需要构建一个单调队列才行。 12.最小覆盖子串HARD:做了快一小时,边界条件相当恶心,
普通数组¶
原地哈希
13.最大子数组和MIDDLE:12:00s,刚学会的前缀和立刻就用上了,非常好使。 14.合并区间MIDDLE:4:48s,排序秒杀 15.轮转数组MIDDLE:5:00s,想复杂了,可以直接一个数组排好再复制过来。以及一个空间o1方法还没用 16.除自身以外数组的乘积MID:不会,左右轮转数组(其他题解有个双指针的非常巧妙)。第二遍6:32s 17.缺失的第一个整数Hard:第一次做不出来,原地哈希。第二次20min
矩阵¶
打好标记能有效降低思考复杂度
18.矩阵置零:没想出来,标记的思路很不错。第二遍13.22min 19.螺旋矩阵Mid:(缓存关键位置,不要靠硬算!)30min,思路一下子就想到了,但是卡边界。第二遍也花了20min 20.旋转矩阵Mid: (思路属于是本题独有了)没思路,不会做。第二遍也想复杂了,不用一圈一圈转换。直接先镜像完所有再reverse。 21.搜索二维矩阵II:(也是独有思路)不会。第二遍,依然做错,不要用二维分开查找!。用Z字形查找!!!(不是二分搜索)
链表¶
- 双指针
- 数据结构复制(哈希表+两次遍历(结构+关系))
22.相交链表easy秒杀 23.反转链表easy:迭代秒杀,递归稍微卡了下 24.回文链表easy:轻松秒杀 25.环形链表Easy:轻松秒杀 26.环形链表2,MEDIUM:推导忘了。。记得自己推一次。以及奇妙的bug出现 27.合并两个有序链表EASY:4min,秒了 28.两数相加 midium:30min。思路其没啥大问题,写复杂了,而且指针函数传参实际上只传了地址,形成局部变量,不会影响到原指针 29.两两交换链表中的节点Midume:11m 30.
31.随机链表的复制MIdium:不会。对于(数据结构复制),甭管他怎么变,你就记住最简单的方式:一个哈希表 + 两次遍历(复制结点+连接结构)。第二遍耗时16分钟。 32.排序链表Midium,估计30min:思路很快就有了。但临界条件真的很恶心人,特别是快慢指针分割的时候 33.合并k个升序链表:第一次没做出来。。。第二次用归并法,还有优先队列法(使用堆让所有链表同时开始排序) 34.LRU缓存
二叉树¶
核心思路: 1.分解问题:动规--子树(整块,一般需要返回值或辅助结构) 2.遍历:回溯-树枝(移动的过程),DFS-节点(单一处理) 前序:只能拿到参数父节点数据 中序:参数与左返回值,一般解决==BST问题== 后序:参数,左右返回值,效率最高。关键词:子树,含返回值 (直径问题-树形DP,前缀和) - 35:二叉树的中序遍历:这道题必须要相当熟练一定要学会灰白标记通用迭代法! - 36.二叉树最大深度:秒杀 - 37.翻转二叉树:秒杀 - 38.对称二叉树EASY:6:28,不过思路没怎么卡,算秒杀 - 39.二叉树的直径EASY:不会。(其实用个外置变量记录深度和就好) - 40.层序遍历MID:BFS模版题11:00,卡在了一个给二维数组分配内存的小问题上。 - 41.将有序数组转换为二叉搜索树EASY:8:18s,一遍过但是感觉做的有点久。 - 42.验证二叉搜索树MID:77/86,忽略了整个右树都要比左树大,无思路。20:00,被一个分号卡了十分钟 - 43.二叉搜索树中第K小的元素MID:没思路,其实很简单,因为有序,按照中序遍历第K个元素。第二遍4:55s - 44.二叉树的右视图MID:6:00,秒了 - 45.二叉树展开为链表MID:没思路。头插法逆先序遍历能秒解,进阶O1空间前驱法也应该关注 - 46.前序中序构造二叉树MID:可以map映射优化,13:19s暴力解了,还可以再提升。 像这种==和=k==的连续子结构,一定要想到==前缀和== - 47.路径总合IIIMid:30:32s,有点烧脑袋,前缀和+哈希表+回溯 - 48.二叉树的最近公共祖先:可优化,用17:26s并且两个辅助数组存解出来了,但实际上可以直接返回对应的指针并判断都返回了。 - 49. 二叉树中的最大路径和HARD:不会,39题变种,树形DP。但其实不难。
图论¶
50.岛屿数量:基础岛屿 51.腐烂的橘子:必须用bfs的岛屿 52.课程表:判环,第一次没做出来,注意回溯 53.前缀树
回溯¶
54.全排列MID:30:00,第一次碰不太会 55.子集MID:还是在选择策略上卡住了,不太熟练 56.电话号码的字母组合MID:没习惯用字符串,一堆边界问题。 57.组合总合MID:8:54s 58.括号生成MiD:字符串没习惯,思路基本对了 59.单词搜索mid:通关,但是耗时长 60.分割回文串N:第一遍不会做,验证回文串确定法。 61.N皇后HARD:第一遍不会做。最后发现其实就是暴力搜索
二分查找¶
关键词:排序,部分有序
找准目标区域条件。 - 62.搜索插入位置(标准二分查找)EASY:用了递归,实则根本不需要。再用二分搜索--3分钟 - 63.搜索二维矩阵Mid:标准的两次二分查找,忘了计时,总之差不多 - 64.在排序数组中查找元素的第一个和最后一个位置:其实就是upbound和lowbound,原理大致一样,但是做的太慢了 - 65.搜索旋转排序数组MID:8分钟用了On的方法做了,但实际上需要的是Logn的方法。 - 66.寻找排序数组中的最小值:也是没找清楚目标区域,Logn没做出来 - 67.两个正序数组的中位数:放弃了。没做的欲望
栈¶
栈、辅助栈、单调栈 括号匹配->栈 - 69.有效的括号Easy:4分26s - 70.最小栈MID:不会。辅助栈 - 71.字符串解码MID:不会。多个类型数据用多种栈缓存,利用分配率解开嵌套并存入缓存。 -
堆¶
建堆,堆排序,topK - 数组中的第k个最大元素:第一次不会建堆 - 前k个高频元素
贪心算法:¶
最优子结构,跳跃问题,区间调度问题。 - 77.买卖股票最佳时机EASY:第一次没做出来 - 78.跳跃游戏MID:很快秒杀,注意边界条件0在最后不用判false - 79.跳跃游戏IIMID:卡了很久。思路差不多,但是写的太麻烦。临界条件没琢磨出来 - 80.划分字母区间:第一次做不来。
动态规划¶
81.爬楼梯 Easy:秒杀 82.杨辉三角Easy:第一遍想的太复杂,第二遍看了题解但是没有想到使用resize 83.打家劫舍Midum:(不取相邻求最大),8:36急速写完 84.完全平方数Mid:(最少平方数相加,先算没拿的情况再+1)8:30过样例,但超时。 85.零钱兑换Mid:(也是相加求最少问题) 15:08s过,卡了下特判。 86.单词拆分Mid:这字符串操作死了慕了!!!思路其实和前两道题还是比较相似的 87.最长递增子序列Mid:(子序列问题) 8:35s过。 88.乘积最大子数组Mid:(连续子序和问题,正负分类讨论) 没思路不会做 89.分割等和子集Mid:(经典01背包问题) 17:22做出来,还不够熟练,和其他背包没有完全分清楚 90.最长有效括号(Hard):(连续子序列问题+栈)最开始误解题意了,18:36s过了70个样例。后面发现嵌套的括号也要计算,这下思路就不是很清晰了。看了下题解,其实只需要一步修改(即使用计算好的小括号再次计算),相当nb的动态规划思路。而后面的栈思路和左右指针思路更是神中神。
多维动态规划¶
- 91.不同路径Mid:多维签到题,3min秒了
- 92.最小路径和Mid:签到题的变种,5min秒了
- 93.最小回文子串Mid:(回文串题目,两种方法)不会做,相当独特的动态规划思路,不过用中心扩展思想我觉得更加好理解一些。
- 94.最长公共子序列:(子序列,双字符串动态规划)
- 95.编辑距离Mid:(子序列,双字符串动态规划)多种方法怎么抉择?都试一遍,暴力:递归选最好。动规:左、右字符串分为两个维度,两个指针同时走(特别是相同的时候,一般都要记录的)。
技巧¶
96.只出现一次的数值Easy:技巧题目-异或性质(异或交换律),知道了就很简单。 97.
HOT100外的必刷题¶
- 排序链表
- 重排链表(网易重点)
- 判断2的n次方
- 模式匹配(米忽悠)
- 并查集题型(网易、米忽悠)