12. 删除有序数组中的重复项
给你一个升序排列的数组 nums,请你原地删除重复出现的元素,使每个元素只出现一次,
返回删除后数组的新长度。元素的相对顺序应该保持 一致 。然后返回nums中唯一元素的个数。
示例:
输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
常用的算法分别是:函数法、双指针法 和 递归算法。
函数法:(这个方法是错误的,本人也不清楚,有知道的评论区指教指教~)
函数法的思路:使用 set() 去重。
# 函数法 时间复杂度:O(n) 空间复杂度:O(1)
def remove_duplicates1(nums):
return len((set(nums)))
双指针法:
双指针法的思路:利用了数组有序的特点,i, j 两个指针协同工作,实现空间 O(1) 的原地去重。
# 双指针法 时间复杂度:O(n) 空间复杂度:O(1)
def remove_duplicates2(nums):
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) 空间复杂度:O(n)
def remove_duplicates3(nums):
if not nums:
raise Exception('数组中没有元素!')
if len(nums) == 1:
return 1
i = 1
while i < len(nums) and nums[i] == nums[0]:
i += 1
return 1 + remove_duplicates3(nums[i:])
题目来源:力扣