力扣自己做题目自己看26. 删除有序数组中的重复项

📅 2026/7/23 3:07:46
力扣自己做题目自己看26. 删除有序数组中的重复项
给你一个非严格递增排列的数组nums请你原地删除重复出现的元素使每个元素只出现一次返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k。去重后返回唯一元素的数量k。nums的前k个元素应包含排序后的唯一数字。下标k - 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,2]输出2, nums [1,2,_]解释函数应该返回新的长度 2并且原数组nums的前两个元素被修改为1,2。不需要考虑数组中超出新长度后面的元素。示例 2输入nums [0,0,1,1,1,2,2,3,3,4]输出5, nums [0,1,2,3,4,_,_,_,_,_]解释函数应该返回新的长度 5 并且原数组nums的前五个元素被修改为0,1,2,3,4。不需要考虑数组中超出新长度后面的元素。解答这题也是快慢指针j作为快指针遍历数组元素i作为慢指针然后j遍历的过程中nums[j]与nums[i]不相等时将i往前挪一位并将第一次出现的nums[j]放在nums[i]占位i是重组数组的最后一位的下标。前提数组为非递减有序数组重复元素必然相邻。慢指针 i始终标记「去重后新数组的最后一个元素」的下标初始值为 0数组第一个元素天然唯一直接作为去重数组的首位。快指针 j作为遍历指针从下标 1 开始逐个扫描原数组的所有元素。执行逻辑 快指针 j 向后遍历的过程中若nums[j] ≠ nums[i]说明 j 位置是一个从未出现过的新唯一元素先将慢指针 i 向后移动 1 位腾出空位再将 nums [j] 的值赋值给 nums [i]把这个新元素加入去重数组的末尾若nums[j] nums[i]说明是重复元素直接跳过j 继续向后遍历即可。返回结果i 是去重数组最后一位的下标数组长度 下标 1因此返回i 1。总结快慢双指针原地去重快指针遍历找新元素慢指针守住去重数组末尾遇到不同元素就慢指针后移、覆盖赋值最终返回慢指针下标 1。class Solution(object): def removeDuplicates(self, nums): :type nums: List[int] :rtype: int i0 for j in range(1,len(nums)): if nums[i]!nums[j]: i1 nums[i]nums[j] return i1