1. 数组类之双指针类型
算法中双指针技巧可以分为左右指针和快慢指针两种类型。其定义可概括如下:
-
左右指针:左右指针两个指针分别指向从数组的头和尾 -
快慢指针:从数组的同一侧开始出发
1.2 快慢指针
快指针的作用是不断地向前找到匹配的元素,慢指针则是用于保存快指针匹配到的元素。
- (leetcode26)删除有序数组中的重复项,且要求使用常量级的空间存储 在数组有序的条件下,重复项都是相连。将快慢指针均指向数组头部,快指针不断地向前移动,一旦匹配到元素和慢指针元素的值不相同,就保存该值,将慢指针向前移动
function removeDuplicates(nums){
let i = 0,j = 0;
while(j < nums.length){
if(nums[j] !== nums[i]){
i++;
nums[i] = nums[j];
}
j++;
}
}
- (leetcode83) 原地移除指定元素 同样当快指针指向的元素非指定元素的时候,将其赋值给慢指针
function removeElements(nums,val){
let i = 0,j = 0;
while(j < nums.length){
if(nums[j] !== val){
nums[i] = nums[j];
i++;
}
j++;
}
}
1.2.1 快慢指针--滑动窗口
1.3 左右指针
左右指针一般都是针对于有序的数组,根据左右元素的值来决定下一步是左指针移动还是右指针移动。
- 二分查找算法
- 判断两数之和(在有序数组中找到能组成指定值的两个数)
function twosums(nums,val){
let i = 0,j = nums.length;
while(i<j){
let sum = nums[i] + nums[j];
if(sum === val) return [i,j];
sum > val? j--:i++;
}
}
- 反转数组
- 最长回文子串 回文串的长度可以为奇数、偶数,奇数回文串的中心为一个元素,左右两边依次对称。偶数长度的回文串的中心为两个元素,左右同样对称。
function palindrome(s,i,j){
while(i >= 0 && j <= s.length && s[i] === s[j]){
i--;j++;
}
// 返回以s[i] s[j] 为中心的最长回文串
return s.substring(i+1,j)
}
function largestpalindrome(s){
let res = '';
for(let i = 0; i < s.length; i++){
const res1 = palindrome(s,i,i); // 奇数长度
const res2 = palindrome(s,i,i+1); // 偶数长度
const resi = palindrome(s,i,i).lenght > palindrome(s,i,i+1).length? palindrome(s,i,i):palindrome(s,i,i+1);
res = res.length > resi.length? res:resi
}
return res;
}