Skip to content
On this page

26-删除有序数组中的重复项

标签:数组 双指针

题目信息

题目地址删除有序数组中的重复项

题目内容:

javascript
给你一个非严格递增排列的数组nums

请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。

元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。

考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:

1) 更改数组nums,使nums的前k个元素包含唯一元素,并按照它们最初在nums中出现的顺序排列。
nums的其余元素与nums的大小不重要。
2) 返回k。

示例 1
  输入:nums = [1,1,2]
  输出:2, nums = [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]
  解释:函数应该返回新的长度5, 并且原数组nums的前五个元素被修改为0, 1, 2, 3, 4。不需要考虑数组中超出新长度后面的元素。

题解

解法一

思路:

题目中要求需要原地删除数组中重复的值,所以是需要遍历数组的

原地删除数组中的值会导致数组的长度是变化的,所以遍历过程中需要额外的一个索引值来表示当前遍历的位置,还需要将不重复的值存起来

先创建一个Set(也可以是空对象或者Map这里随意),存储不重复的值

定义初始索引index,当index小于数组长度时,获取数组当前index索引位置的值,然后与Set中存储的值进行比较

如果当前值在Set中已存在,直接将该值从数组中删除,并且将数组长度减1,否则就将该值添加到Set中,并且index加1

最后返回数组的长度即可

代码实现:

javascript
/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    // 记录数组长度
    let allLen = nums.length
    // 如果数组长度小于等于1,直接返回数组长度即可
    if(allLen <= 1) return allLen
    // 定义遍历索引,创建一个Set
    let index = 0
    const unique = new Set()
    while(index < allLen) {
        const curVal = nums[index]
        if(unique.has(curVal)) {
            nums.splice(index, 1)
            // 删除元素后,数组长度需要减1
            allLen--
            continue
        }
        unique.add(curVal)
        // 不是重复的元素的话 index加1
        index++
    }
    return nums.length
};