剑指Offer之面试题26:删除排序数组中的重复项

举报
宇宙之一粟 发表于 2022/03/29 00:21:32 2022/03/29
【摘要】 题目给你一个升序排列的数组 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。