中等
给定一个按 非递减顺序 排列的整数数组 nums,请你 原地 删除部分重复元素,使得每个不同的元素 最多出现两次。元素的 相对顺序 应保持 不变。
由于在某些语言中无法改变数组的长度,因此必须将结果放在数组 nums 的前半部分。更准确地说,如果删除重复元素后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。前 k 个元素之后的内容无关紧要。
将最终结果放入 nums 的前 k 个位置后,返回 k。
不要 为另一个数组分配额外空间。你必须使用 O(1) 的额外内存,通过 原地 修改输入数组 来完成此操作。
自定义判题:
判题程序将使用以下代码测试你的解答:
int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的预期答案
int k = removeDuplicates(nums); // 调用你的实现
assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
assert nums[i] == expectedNums[i];
}
如果所有断言都通过,那么你的解答将被 接受。
示例 1:
输入:nums = [1,1,1,2,2,3] 输出:5, nums = [1,1,2,2,3,_] 解释:你的函数应该返回 k = 5,并且 nums 的前五个元素分别为 1、1、2、2 和 3。 返回的 k 之后的元素是什么并不重要(因此用下划线表示)。
示例 2:
输入:nums = [0,0,1,1,1,1,2,3,3] 输出:7, nums = [0,0,1,1,2,3,3,_,_] 解释:你的函数应该返回 k = 7,并且 nums 的前七个元素分别为 0、0、1、1、2、3 和 3。 返回的 k 之后的元素是什么并不重要(因此用下划线表示)。
提示:
1 <= nums.length <= 3 * 104-104 <= nums[i] <= 104nums已按 非递减 顺序排列。