删除排序数组中的重复项
题目
个人方法
分析:
- 给出的是已经排好序的数组,那么重复的元素肯定相邻
- 题目中要求的是要在给出的数组上操作,而我们如果不使用深拷贝,就需要一些能操作原始数组的方法,
Array.splice()也就是此次用到的核心方法 - 算法:遍历数组,如果第
i项与第i+1项重复,那么就删除第i项,再用i--更新下标
代码:
var removeDuplicates = function(nums) { // 遍历数组 for (var i=0; i<nums.length-1; i++) { if (nums[i] == nums[i + 1]) { // 若重复 nums.splice(i,1); // 删除第i项 i--; // 更新下标 } } return nums.length; };
大佬启示
法一
对于返回的长度,很明显,等于 原数组的长度 - 重复元素的个数
对于返回的数组,由题干以及两个示例可以得出:只是重复的部分被不重复的部分所替代
- 如,对于
[1, 2, 3, 3, 4, 5, 6, 6, 7],经过操作后应该是[1, 2, 3, 4, 5, 6, 7, 6, 7],而返回的数组是前7个不重复的元素,即[1, 2, 3, 4, 5, 6, 7],返回的长度为7
- 如,对于
所以,算法如下:
- 定义
count来记录重复的元素 - 用
i(1 ≤ i ≤ n)循环下标来遍历原数组- 若
nums[i]与nums[i-1]相同,则count + 1,表示这是第几个重复的元素, - 若
nums[i]与nums[i-1]不同,则nums[i]应该向前移动count个下标来替换num[i-count]
- 若
- 例如:对于
[1, 2, 3, 3, 4, 5, 6, 6, 7],1 ≤ i ≤ 2时count=0,这段区间的num[i]不需要移动,而i=3时,num[i]等于num[i-1],此时count应该+1,i=4时,num[i]就应该替换num[i-count],也就是num[4]要替换num[3]
- 定义
代码:
var removeDuplicates = function(nums) { var count = 0; for(var i=1,len=nums.length; i<len; i++){ if(nums[i] == nums[i-1]) count ++; else nums[i-count] = nums[i] } return len-count; };
法二(双指针法)
顾名思义,我们将会用到两个指针,分别是遍历数组的
i,和记录重复元素第一次出现位置的r算法如下:
- 用
i(1 ≤ i ≤ n)遍历数组,并初始化r=0 - 若
nums[i]不等于nums[i-1],则r++且i++,且执行nums[r] = num[i](这是为了之后遇到不重复元素做铺垫),两个指针将同步循环 - 若
nums[i]等于nums[i-1],则r不变,而只是i++,此时的r将记录下重复元素的首次下标 - 因为
r是索引值,所以最后返回的长度是r+1
- 用
代码:
var removeDuplicates = function(nums) { var r = 0; for(var i=1,len=n.length; i<len; i++) { if(nums[i] != nums[i-1]) { r ++; nums[r] = nums[i] } } return r+1; }
本作品采用《CC 协议》,转载必须注明作者和本文链接

关于 LearnKu
嘿嘿,猜猜我是谁 :see_no_evil: