Algorithms / LeetCode
算法刷题模型整理(三)
按链表、数组、哈希表、字符串等主题整理常见题型、核心思路和易错点。
LC454 四数相加II
解题模型:
分组
核心思路:
将两个数组各取一个元素相加的结果存入哈希表,key为值,value为出现次数,另两个数组各取一个元素相加的值的相反数在表中查找,找到答案就加上对应出现次数,即简化为类似于两数之和的问题
易错点
- 哈希表直接用
[]运算符访问,若key不存在,会创建一个新key,若value为int类型,会被初始化为0,所以当value为int,直接用ht[key]+=1;时,若key不存在,会插入(key, 0),再将ht[key]+=1; - 这题不需要下标,需要答案数,所以哈希表value存出现次数
字符串
LC344 反转字符串
解题模型:
双指针
核心思路:
头尾指针,swap字符
易错点:
- right指针的--不要写成++了
LC541 反转字符串II
解题模型:
模拟法
核心思路:
i从0开始,步长2*k,大于等于n时退出,可使用std::reverse,注意要传入迭代器,参数为s.begin()+i, s.begin()+i+min(k,n-i);
易错点:
- 迭代器可以直接+运算符
- 注意不足k时的操作,直接使用min函数
LC151 反转字符串中的单词
解题模型:
双指针
核心思路:
思路1:快慢指针,同时从尾部开始扫描
思路2:去除多余空格,反转整个字符串,再对每个单词进行反转
易错点:
- 注意string操作的性能问题,如ans= “ ” + ans;性能低,substr和earse都对性能影响很大
- 去除多余空格的方法,快慢指针扫描,可参考数组的移除目标元素,直接前移,去除头部和中间多余空格,然后resize顺便去除尾部空格
二叉树
LC144/094/145/102 二叉树的前/中/后/层序遍历
解题模型:
递归/迭代
核心思路:
前/中/后序:
思路1:递归,编写递归函数
思路2:迭代,手动维护栈模拟遍历过程
层序:
BFS,不需要分层用队列即可,需要分层就从开始的时候记录队列长度n,此时后面的n个即为所有的该层元素,遍历完n个以后 再更新一遍n
易错点:
- 前/中/后序的退出时间,后序遍历因为最后遍历根节点,所以遍历完需要将指针设为空,否则不能退出循环,另外两个最后遍历右节点,所以不用
- 层序遍历要套两层循环
LC226 翻转二叉树
解题模型:
递归/迭代
核心思路:
后序遍历二叉树,翻转左右节点
易错点:
- 注意根节点为空的情况