双指针-数组
双指针-数组
双指针技巧主要分为两类:左右指针和快慢指针。
所谓左右指针,就是两个指针相向而行或者相背而行;而所谓快慢指针,就是两个指针同向而行,一快一慢。
删除有序数组中的重复项
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,找到以每一个字符为中心,或者以一个字符以及后一个字符为中心的回文串,保留长度最长的即可