4.双指针算法

109 阅读1分钟

1.双指针

双指针:采用两个指针,对一个数组或者字符串进行遍历,包括同向的快慢指针和反向的对撞指针

2.对撞指针

i:左指针 0,j:右指针 lenght-1,当i>=j则代表指针对撞,这时应该终止,否则i++;j--进行下一轮迭代

实现代码:

let arr = new Array(10).fill(0).map((item,i)=>i+1) // [1,...,10]
let i=0, j=arr.length-1 // 左右指针
while(i<j){
  [arr[i],arr[j]]=[arr[j],arr[i]]
  i++
  j--
}
console.log('对撞前的索引:',i--,j++)

3.快慢指针

i:慢指针 步进1,j:快指针 步进>=1且j>=i,终止条件看情况,一般为j<length或者arr[i]==arr[j]

实现代码:

// 原地数组去重(前提数组有序)
function f(arr){ // arr有序
  if(arr.length==0) return arr
  
  let i = 0
  for(let j = 1;j<arr.length;j++){
    if(arr[j]==[i]) arr.splice(j--,1)
    else i++
  }
  return arr
}

// 或者
function f(arr){
  if(arr.length==0) return arr
  
  let i = 0
  for(let j=1;j<arr.length;j++){
    if(arr[j]!==arr[i]){
      i++
      arr[i] = arr[j]
    }
  }
  arr.length = i+1 // arr.splice(i+1) 
  return arr
}

参考

1. 发现算法之美-双指针之对撞指针

2. 前端算法技巧锻炼之双指针法