返回
LeetCode 26:巧用O(1)复杂度去除排序数组中重复项
前端
2023-10-04 05:47:05
LeetCode 26 题解
给定一个排序数组,要求我们原地修改数组,删除重复出现的元素,并返回删除后数组的新长度。题目要求我们不能使用额外的数组空间,这意味着我们必须在原数组上进行操作。这给我们带来了很大的挑战,因为我们在删除元素时可能会破坏数组的顺序。
算法思路
为了解决这个问题,我们可以采用一种叫做「双指针」的技巧。双指针法使用两个指针来遍历数组,一个指针用来记录当前位置,另一个指针用来记录当前值是否重复。
具体步骤如下:
- 定义两个指针
i
和j
,分别初始化为 0 和 1。 - 循环遍历数组,当
nums[j]
不等于nums[j-1]
时,将nums[i]
的值设置为nums[j]
并将i
加 1。 - 重复步骤 2,直到
j
指针到达数组末尾。 - 返回
i
的值,即为删除重复元素后数组的新长度。
代码示例
def remove_duplicates(nums):
"""
原地删除数组中重复的元素,并返回删除后数组的新长度。
参数:
nums: 待处理的数组
返回值:
删除重复元素后数组的新长度
"""
if not nums:
return 0
i = 0
j = 1
while j < len(nums):
if nums[j] != nums[j-1]:
i += 1
nums[i] = nums[j]
j += 1
return i + 1
# 测试代码
nums = [1, 1, 2, 2, 3, 3, 4, 4, 5, 5]
new_length = remove_duplicates(nums)
print(f"删除重复元素后数组的新长度为:{new_length}")
print(f"删除重复元素后的数组为:{nums[:new_length]}")
输出:
删除重复元素后数组的新长度为:5
删除重复元素后的数组为:[1, 2, 3, 4, 5]
时间复杂度
双指针法的时间复杂度为 O(n),其中 n 为数组的长度。这是因为双指针法需要遍历数组一遍,时间复杂度与数组的长度成正比。
空间复杂度
双指针法的空间复杂度为 O(1)。这是因为双指针法只使用了两个指针来遍历数组,而这两个指针只占用常数空间。因此,双指针法的空间复杂度不受数组长度的影响。
总结
LeetCode 26 题要求我们原地修改数组,删除重复出现的元素,并返回删除后数组的新长度。本篇博客介绍了双指针法来解决这个问题,双指针法的思想是使用两个指针来遍历数组,一个指针用来记录当前位置,另一个指针用来记录当前值是否重复。
双指针法的优点是时间复杂度为 O(n),空间复杂度为 O(1)。这使得双指针法非常适合于解决这类需要原地修改数组的问题。