26-删除排序数组中的重复项
题目描述
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例 1:
输入: nums = [1,1,2]
输出: 2, nums = [1,2,_]
示例 2:
输入: nums = [0,0,1,1,1,2,2,3,3,4]
输出: 5, nums = [0,1,2,3,4]
分析
和27题删除指定元素相似。删除的目标元素就是上一个元素,比如我们现在fast指向3,但是slow如果不是3的话,就fast和slow都后移一下;如果是3的话,则slow不动,fast后移;这样在碰见下一个不是3的数字的时候slow才会后移并赋值,这样一来就确保了没有重复项,但是最终slow指向的地方是满足要求的数组的索引处,比满足要求的数组的长度少一,故返回值需要加一。
题解
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
let slow = 0;
for(let fast=0; fast<nums.length; fast++) {
if(nums[slow]!=nums[fast]) {
slow++;
nums[slow] = nums[fast]
}
}
return slow + 1;
};
分析
时间复杂度:O(n)
空间复杂度:O(1)
难点
双指针