题型:删除数组指定元素,删除数组重复项,
方法:双指针
模板如下(根据题型调整):
assign用于复制不同种类的容器:
轮转数组:反转三次数组即可:
跳跃游戏2:记录第一跳的左右区间,再记录第二跳的左右区间再…直到区间越界:
分发糖果:拆分成左规则和右规则分别求出数组,每一项取左右规则的较大值即可:
String.substr用法:截取字符串:
最长公共前缀:横向扫描即可:
string翻转:
Kmp问题可以直接使用string.find()函数:
Kmp代码实现:
二叉树遍历的简单迭代法::
二叉树先序遍历迭代法:(在层序遍历的代码模板上稍微改动一下):注意由于栈先进后出,所以我们先推入右节点,再推入左节点。
二叉树后序遍历迭代法:(在先序遍历迭代法的代码模板上稍微改动一下):
二叉树的中序遍历无法在原先的模板上改动:(代码风格不一样):
动态规划五部曲:
口诀:义推初顺印(一推出顺应)
·01背包问题:(许多问题都是基于01背包问题模型的)
二维数组法:
滚动一维数组法:(注意:for循环第二层必须倒序)
·完全背包问题:每个物品可以取多次(只需要将第二层for循环改为正序即可)
面试喜欢考二叉树的基础操作;
递归三部曲:
关键点:总油量大于总里程必然能跑完的,只需要遍历一次就可以了
注意cmp函数的自定义实现
哈希表的高阶用法
哈希表的使用(生)
三数之和双指针法注意去重和越界
Map.erase(it)和map.erase(key)
动态规划记录前n项和+哈希表记录
使用到了优先队列去自动的维护最大值(注意注释内容,容易犯错)
使用单调队列可以让插入和删除达到O(1)
避免犯错的小技巧:1.在草稿纸上画草图2.使用如图中的函数,将头和尾一起传入和传出
在原链表的每个节点后面插入一个拷贝的节点,random复制完成之后拆分新旧链表即可。
手撕快排:
上题在快排的基础上稍作修改变成快速选择算法,时间复杂度为O(n)
黄金链表翻转函数:(所有的翻转链表题目都基于此段代码)
先找到中间节点的前驱,再翻转后一半,在将两半链表错位连接。
因为回文串天生具有递推的特性,所以采用动态规划。
递推公式:dp[i][j]=(s[i]==s[j])&&(j-i<3||dp[i+1][j-1]);
二分法的两种常见写法:
1.左闭右开
2.左闭右闭
中序遍历迭代形式:一路向左
组合问题使用startIndex来去重,排列问题使用used数组去重。