记录自己看leetCode算法,自己的代码实现和推荐代码实现
删除数组中的重复项
问题
给你一个有序数组 nums ,请你原地 删除重复出现的元素,使每个元素 只出现一次,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组,并在使用O(1)额外空间的条件下完成。
分析
- 代码有序
- 不适应额外数组空间
自己的代码
var removeDuplicates = function (nums) {
for (let i = 0; i < nums.length; i++) {
if (nums[i + 1] == undefined) {
break;
}
if (nums[i] == nums[i + 1]) {
nums.splice(i + 1,1);
i--
}
}
return nums.length
}
推荐写法
解法:双指针
首先数组有序,重复元素一定相邻
要求删除重复元素,实际上就是将不重复的元素移到数组左侧
考虑用两个指针,一个在前记作p,一个在后记作q,算法流程如下:
- 比较p和q位置元素是否相等。
如果相等,q后移1位
如果不相等,将q位置的元素赋值到p+1位置上,p后移一位,q后移1位重复上述过程,知道q等于数组长度。
返回p+1,即为新数组长度
var removeDuplicates = function (nums) {
let p = 0;
let q = 1;
while (q < nums.length) {
if (nums[p] != nums[q]) {
if (q - p > 1) { // 优化
num[p + 1] = nums[q];
}
p++;
}
q++;
}
return p + 1;
}