剑指Offer之面试题26:删除排序数组中的重复项
【摘要】 题目给你一个升序排列的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保持一致。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空...
题目
给你一个升序排列的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。元素的相对顺序应该保持一致。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
见下图:

解题思路
一、快慢指针
题目要求删除重复的数字,也就是把不重复的数字往前移,因为不需要考虑数组中超出新长度后面的元素。可以运用快慢指针的方法来做。
声明一个指针为 i,指向第一个元素位置,另一个指针为 j,指向第二个元素位置,判断这两个元素相不相等,如果这两个元素相等话,j 的位置加一,继续判断这两个位置的元素相不相等,如果这两个元素不相等,将 j 位置上的元素赋值给 i +1 位置上,j 的位置加一,直到 j 的位置等于数组的长度,最后返回 i+1 的值。
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
i = 0
l = len(nums)
while i < l:
if nums[i] == val:
nums[i] = nums[l-1]
l -= 1
else:
i += 1
return l
二、一次遍历,前后对比
因为是有序数组,所以可以通过遍历一次数组,然后比较前后的数据,发现一样的话,我们就直接删除重复值。知道遍历结束,返回新数组的长度。
# 此方法适用于排序数组
class Solution:
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
j = 0
while j < len(nums)-1:
if nums[j] == nums[j+1]:
nums.remove(nums[j])
else:
j = j + 1
return len(nums)
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)