给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
要求:不能使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。所以,是一个原地排序算法需要解决的问题。
示例 1:
给定数组 nums = [1,1,2], 函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
你不需要考虑数组中超出新长度后面的元素。
示例 2:
给定 nums = [0,0,1,1,1,2,2,3,3,4], 函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
你不需要考虑数组中超出新长度后面的元素。
关于空间和时间复杂度的概念,建议阅读这篇文章:
《算法的时间复杂度和空间复杂度》:https://www.jianshu.com/p/88a1c8ed6254
或者在文章底部点击【阅读原文】
先思考一下,后面我会给出一个解题思路~?
图来自网络
因为是要求O(1)的空间复杂度完成,所以我们不能新增数组来修改nums的元素,只能对原数组进行原地修改。
这里还是用到了昨天的双指针算法思想:
1 )首先因为要用到双指针算法,所以得保证数组是排序好的
2 )定义两个指针,一个叫慢指针slow,一个叫快指针fast,均从数组nums左边开始,慢指针初始位置为0,快指针初始位置为1
3 )如果出现快指针的值等于慢指针的值的时候,跳过当前位置,向右移动快指针,快指针fast+1,否则,赋值nums[slow+1]的值为当前快指针的值,并且快慢指针均右移一位
这里可能有点抽象,可以看下案例:
比如 nums = [0,0,1,1,1,2,2,3,3,4]
初始状态,slow=0, fast=1
比较nums[slow] 和 nums[fast], 当前均为0,故相等,跳过,fast+1,fast更新为2
继续比较nums[slow] 和 nums[fast], 当前为0 和1,不相等,所以进行赋值,nums[slow+1]=nums[fast], 即nums[1] = 1, 同时双指针都右移一位,slow更新为1,fast更新为3
一直循环迭代,直到fast=len(nums)停止迭代
Python实现:
# 删除排序数组中的重复项
def removeDuplicates(nums):
length = len(nums)
if length<2: return length
slow, fast = 0,1
while fast < length:
if nums[fast] == nums[slow]: fast+=1
else:
nums[slow+1] = nums[fast]
slow+=1
fast+=1
return slow+1
nums1 = [0,0,1,1,1,2,2,3,3,4]
nums2 = [1,1,2]
removeDuplicates(nums)
? 配图角色背景介绍
原是秘密组织神盾局的一名俄国籍女探员,体态婀娜面容姣好,头脑清晰行动敏捷,身手不凡强硬凶狠,是神盾局的精英特工。娜塔莎最初被安排在斯塔克工业内部作为卧底,负责监视钢铁侠托尼·斯塔克,后正式加入复仇者联盟。她也是这次成军的复仇者联盟中唯一的女性成员。特工出身的黑寡妇兼具了美貌与智慧为一体,凌厉的身手加上基因改造血清增强的免疫系统以及抗击打能力,使她拥有了异于常人的实力。在联盟处于万能型的辅助地位,虽然自身实力无法与超级英雄抗衡但是特工的技能让她能将超级英雄玩弄于鼓掌之中。
? 温故而知新