LeetCode(Python)—— 删除有序数组中的重复项(简单)

2023-03-02 00:00:00 重复 组中 序数

题目描述:

给你一个有序数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次 ,返回删除后数组的新长度。

不要使用额外的数组空间,必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。

示例 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 。

解题思路:

由于题目要求我们在原地修改数组,因此我们不能使用额外的数组空间,需要使用双指针技巧来解决这个问题。我们可以使用快慢指针来遍历数组,快指针用于扫描数组,慢指针用于记录不重复的元素的位置。

具体来说,我们初始化快指针和慢指针都指向数组的第一个元素。如果快指针指向的元素和慢指针指向的元素相同,说明该元素重复,我们只需要将快指针继续向前移动即可。如果快指针指向的元素和慢指针指向的元素不同,说明该元素不重复,我们需要将该元素复制到慢指针的下一个位置,并将慢指针向前移动一步。

时间复杂度:O(n),其中 n 是数组的长度。

空间复杂度:O(1)。

Python 代码实现:

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        if not nums:
            return 0

        # 定义快慢指针
        slow = 0
        for fast in range(1, len(nums)):
            # 如果快慢指针指向的元素不同,说明该元素不重复,将该元素复制到慢指针的下一个位置
            if nums[fast] != nums[slow]:
                slow += 1
                nums[slow] = nums[fast]

        # 返回新长度
        return slow + 1

这道题目比较简单,可以通过双指针方法快速解决。

相关文章