Skip to main content

删除排序数组中的重复项

题目

给你一个按升序的排列数组 nums, 请你原地删除重复出现的元素, 使每个元素只出现一次, 返回删除后数组的新长度. 不要使用额外的数组空间, 你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成.

提示:
  • 1 <= nums.length <= 3 * 10⁴
  • -10⁴ <= nums[i] <= 10⁴
  • nums 已按升序排列
示例

输入: nums = [1, 1, 2]

输出: 2, 其中 nums 变成 [1, 2, 2]

题解

看到有序数组, 先想到双指针, 这道题可以使用快慢指针: 让慢指针 slow 走在后面, 快指针 fast 走在前面探路, 找到一个不重复的元素就告诉 slow 并让 slow 前进一步. 这样当 fast 指针遍历完整个数组 nums 后, 前 slow + 1 个就是不重复元素.

/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
let slow = 0

for (let fast = 1; fast < nums.length; fast++) {
if (nums[fast] !== nums[slow]) {
slow++
nums[slow] = nums[fast]
}
}

return slow + 1
}