Amanda-Zhang
追梦女一枚

力扣每日一题-删除排序数组中的重复项(ll)

2021-01-08 -leetcode -算法
Word count: 681 | Reading time: 2min

题目

给定一个增序排列数组 nums ,你需要在 原地 删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3 。 你不需要考虑数组中超出新长度后面的元素。

题解

(1)和昨天刷的那道唯一的区别就是可以允许两个重复数存在。那么也就可以用倒序的方法使用javascript提供的api去做。如下:

1
2
3
4
5
6
7
8
9
var removeDuplicates = function(nums) {
for(i=nums.length-1;i>0;i--){
if(nums[i]===nums[i-2]){
nums.splice(i,1)
}
}
return nums.length

};

(2)如果不用javascript中自带的api做的话,还是只能想到快慢指针的方法,就是这样运行内存和时间都很大。效果不是太好,但是也可以运行通过。

1
2
3
4
5
6
7
8
9
10
11
12
var removeDuplicates = function(nums) {
let fast=0,slow=0
while(fast<nums.length){
if(nums[fast]!==nums[fast+2]){
nums[slow]=nums[fast]
slow++
}
fast++

}
return slow
};

(3)整体思路还是双指针, 这里有一个小的技巧。我们需要创建一个指针P,这个指针从索引为2的地方开始向后移动。
p指向第一个无效位置,什么是无效的位置, 还是以 1 1 1 2 3 这个数组来说 因为数组已经排序了,即使前两个是重复的也是有效的,所以这个p指向的是第一个我们需要更新的位置,第三个 1 也就是索引为2的位置,就是无效的,也就是需要处理的位置。(转自别人的思想,不是太好理解,自己在纸上推了一遍确实是正确的,但是还是想不通为什么要这么做,没有掌握到精髓,下次遇到还是不会想到这种方法)(其实也就是把遍历到的索引第一个和第三个相等的就把第三个跳过去了,相当于不存储,也就是删掉了!!)

1
2
3
4
5
6
7
8
9
10
var removeDuplicates = function(nums) {
let p = 2;
for(let i = 2; i < nums.length; i++) {
if (nums[i] !== nums[p - 2]) {
nums[p] = nums[i];
p++;
}
}
return p
};

除此之外,https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii/solution/shuang-zhi-zhen-zhi-tong-xiang-zhi-zhen-che-di-jie/这个链接里面的大佬总结的同向双指针总结的非常好,可以借鉴!!

< PreviousPost
力扣每日一题-旋转数组(189)
NextPost >
力扣每日一题-移除元素(与删除排序数组中的重复项)
CATALOG
  1. 1. 题目
  2. 2. 题解