返回
用两种方法巧妙应对 LeetCode 26:删除有序数组中的重复项,效率大幅提升
前端
2023-09-25 18:47:09
算法练习系列 26:LeetCode26——删除有序数组中的重复项
1. 循环法
1.1 概述
循环法是一种直接的方法,可以有效地删除有序数组中的重复项。
1.2 代码实现
def remove_duplicates(nums):
# 初始化一个新数组,用于存储不包含重复项的元素。
unique_nums = []
# 遍历给定数组。
for num in nums:
# 如果当前元素不在新数组中,则将其添加到新数组中。
if num not in unique_nums:
unique_nums.append(num)
# 返回新数组。
return unique_nums
1.3 时间复杂度和空间复杂度
- 时间复杂度:O(n),其中 n 为给定数组的长度。
- 空间复杂度:O(n),因为我们创建了一个新数组来存储不包含重复项的元素。
2. 双指针法
2.1 概述
双指针法是一种更有效的方法,可以删除有序数组中的重复项。
2.2 代码实现
def remove_duplicates(nums):
# 初始化两个指针,slow 和 fast。slow 指针指向当前不包含重复项的元素,而 fast 指针遍历给定数组。
slow = 0
fast = 1
# 遍历给定数组。
while fast < len(nums):
# 如果当前元素与前一个元素不同,则将当前元素移动到 slow 指针指向的位置。
if nums[fast] != nums[slow]:
slow += 1
nums[slow] = nums[fast]
# 移动 fast 指针。
fast += 1
# 返回不包含重复项的数组。
return nums[:slow + 1]
2.3 时间复杂度和空间复杂度
- 时间复杂度:O(n),其中 n 为给定数组的长度。
- 空间复杂度:O(1),因为我们没有创建新的数组来存储不包含重复项的元素。
3. 比较
循环法和双指针法都可以有效地删除有序数组中的重复项。然而,双指针法通常更有效,因为它只需要遍历数组一次,而循环法需要遍历数组两次。此外,双指针法不需要额外的空间来存储不包含重复项的元素,而循环法需要。