26. 删除有序数组中的重复项 - 力扣(LeetCode)
题目:
给你一个 非严格递增排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
nums
,使 nums
的前 k
个元素包含唯一元素,并按照它们最初在 nums
中出现的顺序排列。nums
的其余元素与 nums
的大小不重要。k
。解题思路:
1. 原地删除 双引用思想:指针 fir、sec
2. 步骤解析:
(1)fir==sec,指向数组首元素
(2) sec向后移动,如果碰见与fir指向元素不相同的位置,此时fir进行移动。
这一步骤可以理解为:数组中的[0,fir]区间内存放的是不重复的元素,而sec就是负责去找不重复的元素的。一旦找到,fir就得在区间内为这个元素开辟空间,即fir++;
无论是否碰见重复元素,sec引用指针是一直往后移动的;
fir指向的元素就是删除后有效的最后一个元素,最后的有效元素个数就是fir指向的索引+1。
代码实现:
- public int RemoveArrayElements(int[] nums){
- int fir=0,sec=0;
- //sec移动到元素的末尾,此时fir就指向最后一个不重复的元素
- //nums[0,fir]区间均为不重复元素
- while(sec
- if(nums[fir]!=nums[sec]){
- fir+=1;
- nums[fir]=nums[sec];
- }
- sec++;
- }
- return fir+1;
- }
思考:如果删除所有重复元素,如何进行改进?