返回
「双指针」LeetCode 26. 删除有序数组中的重复项(简单)
前端
2023-11-06 10:55:34
题目概述
- 题目链接:26. 删除有序数组中的重复项
- 难度:简单
题目
给你一个有序数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 。返回删除后数组的新长度。
说明:
- 为了解决该问题,您不得将数组中的元素分配到另一个数组中。您必须 原地 修改输入数组并在使用后返回它。
示例:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2,并且原数组 nums 的前两个元素被修改为 1 和 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。不需要考虑数组中超出新长度的部分。
双指针法
对于如何从有序数组中删除重复项,最常见的解决方法之一就是使用双指针法 。双指针法是一种在数组中移动两个指针来跟踪不同元素的技术,它通常用于解决各种数组问题。在解决本问题时,我们可以使用两个指针 i
和 j
。
算法步骤:
- 将指针
i
和j
都初始化为0
。 - 比较
nums[i]
和nums[j]
。 - 如果
nums[i]
和nums[j]
相等,则将j
向右移动一位。 - 如果
nums[i]
和nums[j]
不相等,则将nums[i+1]
设置为nums[j]
,并将i
和j
都向右移动一位。 - 重复步骤 2 到 4,直到
j
达到数组的末尾。 - 返回
i+1
,它代表了新数组的长度。
代码示例:
def removeDuplicates(nums):
"""
:type nums: List[int]
:rtype: int
"""
i = 0
for j in range(1, len(nums)):
if nums[i] != nums[j]:
i += 1
nums[i] = nums[j]
return i + 1
复杂度分析
- 时间复杂度:O(n),其中 n 是数组 nums 的长度。双指针法需要遍历数组一次,因此时间复杂度为 O(n)。
- 空间复杂度:O(1)。双指针法不需要额外空间,因此空间复杂度为 O(1)。
总结
使用双指针法,我们可以轻松地从有序数组中删除重复项。这种方法不仅高效,而且易于理解和实现。通过本文,我们不仅学习了双指针法在数组问题中的应用,还了解了如何使用该算法解决 LeetCode 26. 删除有序数组中的重复项这一具体问题。