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

377 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目

给你一个升序排列的数组 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)

链接:leetcode-cn.com/problems/re…