双指针

双指针

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

用法

对撞指针

对撞指针是指在有序数组中,将指向最左侧的索引定义为左指针(left),
最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。

1
2
3
4
5
6
7
8
9
10
11
12
function fn (list) {
var left = 0;
var right = list.length - 1;

//遍历数组
while (left <= right) {
left++;
// 一些条件判断 和处理
... ...
right--;
}
}

快慢指针

快慢指针也是双指针,但是两个指针从同一侧开始遍历数组,
将这两个指针分别定义为快指针(fast)和慢指针(slow),
两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,
如fast每次增长两个,slow每次增长一个。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var hasCycle = function(head) {
if (head === null || head.next === null) {
return false
}

let slow = head
let fast = head.next

while (slow !== fast) {
if (fast === null || fast.next === null) {
return false
}
slow = slow.next
fast = fast.next.next
}
return true
};

总结

当遇到有序数组时,应该优先想到双指针来解决问题,因两个指针的同时遍历会减少空间复杂度和时间复杂度。

------ 本文结束感谢您的阅读 ------
请我一杯咖啡吧!
itingyu 微信打赏 微信打赏