小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
今天来刷两道数组题 来学学快慢指针的思想
26. 删除有序数组中的重复项【简单】
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
【解法一】快慢指针
快指针表示遍历数组到达的下标位置【遍历数组】 慢指针表示下一个不同元素要填入的下标位置【维持条件】
快指针 i
用来遍历一遍数组
慢指针 j
用来维护数组 【维护数组元素不重复的性质】
注意这里的判断条件,满足条件【元素不重复】,慢指针j
才走
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
let j = 0;
for(let i = 0; i < nums.length; i++){
if(nums[i] !== nums[j]){
j++;
nums[j] = nums[i];
}
}
return j + 1;
};
【解法二】双指针
这里利用了JavaScript的特性,就是数组越界的结果是undefined,不会报错
var removeDuplicates = function (nums) {
let j = 0;
for (let i = 0; i < nums.length; i++) {
if (nums[i] !== nums[i + 1]) {
nums[j] = nums[i];
j++;
}
}
return j;
};
也可以将遍历初始值+1,这样就不会出现数组越界了
var removeDuplicates = function(nums) {
let j = 1
for(let i = 1; i < nums.length; i++){
if(nums[i] !== nums[i-1]){
nums[j] = nums[i]
j++
}
}
return j
};
80. 删除有序数组中的重复项 II【中等】
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
与26题解题思路一致,就是多一个计数器
【解法】快慢指针
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
// j 用来维持一个满足条件的数组
let j = 0;
// 定义一个计数变量
let count = 1;
// 遍历nums数组
for(let i = 0; i < nums.length; i++){
// 设置计数器
if(nums[i] === nums[i+1]){
// 遇到和后一个元素相同的情况,计数器加1
count++;
}else{
// 与后一个元素不同,计数器重置为1
count = 1;
}
// j维持一个数组
if(count <= 2){
// 满足条件,j才移动【计数器大于2的时候j不动】
nums[j] = nums[i];
j++;
}
}
return j;
};
换一种数组不越界的写法
var removeDuplicates = function(nums) {
let j = 1
let count = 1
for(let i = 1; i < nums.length; i++){
if(nums[i] === nums[i-1]){
count++
}else{
count = 1
}
if(count <= 2){
nums[j] = nums[i]
j++
}
}
return j
};