题目

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

考虑 nums 的唯一元素的数量为 k。去重后,返回唯一元素的数量 k

nums 的前 k 个元素应包含 排序后 的唯一数字。下标 k - 1 之后的剩余元素可以忽略。

解题

方法一

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    // 如果数组为空,没有唯一元素
    if (nums.length === 0) {
        return 0;
    }
 
    // 慢指针 i,指向下一个唯一元素要存放的位置
    let i = 0; 
    
    // 快指针 j,从 1 开始遍历
    for (let j = 1; j < nums.length; j++) {
        
        // 当快指针 j 发现了一个和慢指针 i 不同的元素
        if (nums[j] !== nums[i]) {
            // 1. 慢指针 i 先前进一步
            i++;
            // 2. 把新元素 nums[j] 放到慢指针 i 的新位置上
            // (这就是“原地”修改)
            nums[i] = nums[j];
        }
        
        // 如果 nums[j] === nums[i],说明是重复的,
        // 此时 i 不动,j 继续前进
    }
 
    // 循环结束后,从 0 到 i (包含i) 都是唯一元素
    // 总个数就是 索引 i + 1
    return i + 1;
};