携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第1天,点击查看活动详情
难度:
简单
题目:
给你一个 升序排列的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保一致 。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例:
输入:nums = [0,1,1,2,3,2,4]
输出:5, nums = [0,1,2,3,4,...]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
解题思路:
根据题目要求,该数组为有序数组且为升序排列,同时只需要前k个元素是最终结果,并返回删除重复项之后的元素个数,我们可以采用双指针的方式删除重复元素,慢指针指向下一个不同元素将要填入的下标位置,而快指针用来遍历数组,找出非重复的元素并根据慢指针填入。
如果数组nums的长度为0,则返回0,当nums的长度为1时,只需要返回数组即可,因此nums的长度大于1时才需要快慢指针进行比对,将慢指针、快指针下标置为1,当快指针与前一个元素相同时,快指针++,进行下一个元素比对,如果快指针与前一个元素不相同时,将快指针指向的元素填充到慢指针指向的填充位,同时慢指针++,指向下一个填充位,快指针++进行下一个元素的比较。
解题代码:
var removeDuplicates = function(nums) {
const numLength=nums.length
if(numLength===0){
return 0
}
let slow=1
let fast=1
while(fast<numLength){
if(nums[fast]!==nums[fast-1]){
nums[slow]=nums[fast]
++slow
}
++fast
}
return slow
};
复杂度分析:
- 时间复杂度:O(n),其中 n 是数组的长度。快指针和慢指针从1到n-1,最多分别移动n次。
- 空间复杂度:O(1)。只需要使用常数数组的长度的额外空间。