题目
给你一个 非严格递增排列 的数组 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;
};