题目描述
给你一个 非严格递增排列 的数组 nums ,请你原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
- 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
- 返回 k 。
判题标准:
系统会用下面的代码来测试你的题解:
如果所有断言都通过,那么您的题解将被 通过。
示例 1:
示例 2:
提示:
- 1 <= nums.length <= 3 * 104
- -104 <= nums[i] <= 104
- nums 已按 非严格递增 排列
题目解析
有序序列去重的通用解法就是双指针技巧中的快慢指针技巧。
我们让慢指针 slow 走在后面,快指针 fast 走在前面探路,找到一个不重复的元素就告诉 slow 并让 slow 前进一步。这样当 fast 指针遍历完整个数组 nums 后,nums[0..slow] 就是不重复元素。
参考代码
以下为 Java 代码。
复杂度分析
- 时间复杂度: O(n),其中 n 是数组的长度。快指针和慢指针最多各移动 n 次。
- 空间复杂度: O(1)。

