Skip to content
On this page

双指针-数组

双指针-数组

双指针技巧主要分为两类:左右指针和快慢指针。

所谓左右指针,就是两个指针相向而行或者相背而行;而所谓快慢指针,就是两个指针同向而行,一快一慢。

删除有序数组中的重复项

slow指针指向不重复的末端,fast指针每次向前移动一位,通过比较两个指针位置处的值是否相等,决定slow指针是否移动并重新赋值。

删除排序链表中的重复元素

删除有序数组中的重复项一样的思路,只是将赋值和右移改为指针的赋值。

移除元素

核心是保证[0-slow]的数组永远不包括val,所以slow指针指向满足条件的数组末尾,fast指针不断的找到非val值进行填充

js
var removeElement = function(nums, val) {
    let slow=0,fast=0;
    while (fast < nums.length) {
        if (nums[fast] != val) {
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
};

移动零

核心是通过上述函数移除0,然后将slow指针后的元素赋值0

二分查找(接下来都是左右指针)

循环条件 nums[left] < nums[right],通过判断mid和target的值来决定left和right指针的移动

两数之和

通过nums[left]和nums[right]的和判断此时和与target的大小情况,来决定是left++,还是right--

反转数组

通过left和right指针,不断交换两个指针的值,同时向中间收缩

回文串判断

通过left和right指针,不断比较两个指针的值,同时向中间收缩,不同则return false;

最长回文子串

采用中心扩散的双指针法,通过遍历字符串s,找到以每一个字符为中心,或者以一个字符以及后一个字符为中心的回文串,保留长度最长的即可