返回
LeetCode刷题从入门到精通:01. 删除数组中的重复项
前端
2023-10-25 19:52:20
在算法题的海洋中,LeetCode脱颖而出,成为程序员修炼内功的必经之路。今天,我们开启LeetCode刷题之旅的第一站——01. 删除数组中的重复项。我们将用通俗易懂的语言,带你领略算法题的魅力,同时锻炼你的编程思维。
问题
给你一个整数数组 nums,请你将数组中的重复元素删除,并返回新的数组。
示例 1:
输入:nums = [1, 1, 2]
输出:[1, 2]
示例 2:
输入:nums = [0, 0, 1, 1, 1, 2, 2, 3, 3, 4]
输出:[0, 1, 2, 3, 4]
思路分析
为了解决这个问题,我们可以使用双指针技巧。具体思路如下:
- 设置两个指针 i 和 j,初始值均为 0。
- 比较 nums[i] 和 nums[j] 的值。
- 如果 nums[i] 和 nums[j] 的值相等,则将 j 向后移动一位。
- 如果 nums[i] 和 nums[j] 的值不相等,则将 nums[i] 处的元素原地复制一遍,然后将 i 和 j 都向后移动一位。
代码实现
def remove_duplicates(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(1),因为我们没有使用任何额外的空间。
优化技巧
为了节省空间,我们可以直接在原数组上进行修改。具体思路如下:
- 设置一个指针 i,初始值为 0。
- 遍历数组 nums,如果 nums[i] 与 nums[i-1] 的值相等,则跳过 nums[i];否则,将 nums[i] 处的元素原地复制一遍。
- 返回 i。
代码实现
def remove_duplicates(nums):
"""
:type nums: List[int]
:rtype: int
"""
i = 0
for num in nums:
if i == 0 or num != nums[i-1]:
nums[i] = num
i += 1
return i
时间复杂度
该算法的时间复杂度为 O(n),其中 n 是数组 nums 的长度。
空间复杂度
该算法的空间复杂度为 O(1),因为我们没有使用任何额外的空间。