双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
1:对撞指针
对撞指针是指在数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。快速排序就是典型的双指针问题。
例(1) : 救生艇问题
function numRescueBoats(people,limit){
people.sort((a,b) => a - b)
let ans = 0;
let left = 0;
let right = people.length - 1;
while(left <= right){
if (people[left] + people[right] <= limit) {
left ++;
}
right --;
ans ++;
}
return ans;
}
例(2): 接雨水问题
function getRainVlume3(height){
let ans = 0;
let left = 0;
let right = height.length-1;
while(left <= right){
let myAns = Math.min(height[left],height[right])*(right-left)
ans = Math.max(ans,myAns)
if (height[left] < height[right]) {
left ++;
}else {
right --;
}
}
return ans;
}
2:快慢指针
快慢指针是两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)和慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如快指针(fast)每次增长两个,慢指针(slow)每次增长一个。一般来说快慢指针常用于判断链表等数据结构中是否有环。
例子 : 环形链表
```javascript
function hasCycle(head){
let fast = head;
let slow = head;
while (fast) {
if (fast.next == null) return false;
slow = slow.next;
fast = fast.next.next;
if (slow == fast) return true;
}
return false;
}