定义
指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
算法思想
利用问题本身与序列的特性(序列递增性质),使用两个下标i、j对序列进行扫描 (可以同向扫描,也可以反向扫描) ,以较低的复杂度解决问题。
对撞指针
// 双指针(双向)
var listt = [];
var i = 0, j = list.length;
while (i < j) {
if (/*条件01成立*/) {
i++;
} else if (/*条件02成立*/) {
j++;
} else {
// 输出第一张成立
i++, j++;
}
}
示例
var list_data = [2, 4, 8, 11, 23, 65, 120, 234, 565, 1288, 2866];
var target = 1292;
var left = 0, right = list_data.length;
var res_data = [];
while (left < right) {
if (list_data[left] + list_data[right] > target) {
right--;
} else if (list_data[left] + list_data[right] < target) {
left++;
} else {
res_data.push({ left, right });
left++;
}
}
console.log("res_data", res_data);
快慢指针
// 双指针(同向)
var list = [];
var a = 0;
for (var i = 0; i < list.length; i++) {
if (/*条件成立*/) {
for (var j = a; j < i; j++) {
// 具体实现
}
// 将指针左端点向右移动
a = i + 1;// 这里条件非法死循环
}
}
示例
String.prototype.split_test = function (ts) {
var res = [];
var a = 0;
for (var i = 0; i < this.length; i++) {
if (this[i] == ts) {
var temp = "";
for (var j = a; j < i; j++) {
temp = temp + this[j];
}
res.push(temp);
a = i + 1;
}
}
return res;
}