第五天:力扣第26题,删除排序数组中的重复项
地址:leetcode-cn.com/problems/re…
思路:没思路,就是splice
var removeDuplicates = function(nums) {
let a=nums[0];
for(let i = 1;i<nums.length;i++)
{
if(a==nums[i])
{
nums.splice(i,1);
i=i-1;
}
else{
a=nums[i];
}
}
};
这个代码不用脑子的,还是取品味一下大佬的代码吧。
var removeDuplicates = function(nums) {
// 剪枝,当数组的长度为0或1时,直接返回数组的长度
if (nums.length < 2) return nums.length;
// 设慢指针指向数组的第一项
let left = 0;
// 快指针指向数组的第二项
let right = 1;
// 循环停止条件,快指针遍历完了数组
while (right < nums.length) {
if (nums[left] === nums[right]) {
// 当快指针和慢指针处的数据相同
// 则不处理,快指针向前进一位
right++
} else {
// 当快慢指针处的数据不相同时
// 将慢指针后一位的数据更改为快指针处的数据
// 同时快慢指针同时向前进一位
nums[left + 1] = nums[right];
right++;
left++;
}
}
// 最后返回慢指针 + 1 就是更新后数组的长度
// 同时数组数据得到了更新
return left + 1;
};
双指针法,挺实用的。
下面的是滑动窗口:
var removeDuplicates = function(nums) {
let idx = 0, nowIdx, pass = 0;
while(idx + pass + 1 < nums.length){
nowIdx = idx + pass + 1;
if(nums[idx] === nums[nowIdx]){
pass++;
}else{
idx++;
[nums[idx], nums[nowIdx]] = [nums[nowIdx], nums[idx]];
}
}
return idx + 1;
};
刚开代码的时候一直在纠结,他们的数组后面不是还在吗,结果好好看了一下题目的输出方式,才懂了,后面的直接不输出了。