算法题-数组-26-删除排序数组中的重复项

96 阅读1分钟

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)

难点

双指针