算法——双指针

129 阅读1分钟

定义

指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

算法思想

利用问题本身与序列的特性(序列递增性质),使用两个下标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;
}