双指针算法
指的是在遍历元素的过程中,不是使用单个指针进行访问,而是使用两个指针进行访问。两个指针可以在循环中做两件事 ,可以将慢指针想象为一个空白容器
用例:
- 一个长度为n的顺序表,删除其中所有值为value的元素
- 对于长度为n的顺序表,去重
对撞指针
两个指针方向相反
快慢指针
两个指针方向相同,快指针定义为fast,慢指针定义为slow,通常情况下fast默认为1,slow默认为0
fast指针走的比slow指针快,而且只有在满足指定条件下时,才会自增slow
使用场景:对有序数组去重
案例
- 对非严格有序数组进行去重
- 对长度为n的顺序表L,编写一个时间复杂度为 O(n)、空间复杂度为 O(1)的算法,该算法删除顺序表中所有值为x的数据元素。
- 从顺序表中删除其值在给定值s和t之间(包含s和t,要求
s < t)的所有元素,若s或t不合理或顺序表为空,则显示出错信息并退出运行。 - 有序顺序表去重
- 多个有序顺序表合并
js
const merge = function(arr1, arr2, arr3) {
let k = 0, i = 0, j = 0;
while (i < arr1.length && j < arr2.length) {
if (arr1[i] < arr2[j]) {
arr3[k++] = arr1[i++];
} else {
arr3[k++] = arr2[j++];
}
}
while (i < arr1.length) {
arr3[k++] = arr1[i++];
}
while (j < arr2.length) {
arr3[k++] = arr2[j++];
}
return arr3
};分离双指针
如果两个指针分别属于不同的数组 / 链表
拓展
- 什么是非严格递增序列和严格递增序列?
最重要的区别:两者中是否有重复的数据
- 非严格递增序列:指的就是整个序列是从小到大的,但是里边会有一些数字会在它本身周围有重复。
如->(1,1,1,2,3,4,5,6,6,6,7,8,9)
- 严格递增序列:就是数字没有重复,且是递增的。
如->(1,2,3,4,5,6,7,8,9)

