题目来自力扣初级算法,供个人学习使用。
1.题目
给你一个 升序排列 的数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
解析:我们要注意的是这是个有序数组,所以相等的元素在数组中的下标一定是连续的。利用数组有序的特点,可以通过双指针的方法删除重复元素。
指针fast用于遍历数组,指针slow用于确定有效数组长度。也就是说下标0~slow-1,为有效数组的下标区间,返回值为slow。
2.题解
/**
* @param {number[]} nums
* @return {number}
*/
//给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,
//使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
const array = [1, 2, 3, 4, 4, 5, 5, 6];
var removeDuplicates = function (nums) {
const n = nums.length;
// 边界判断
if (n === 0) return 0;
// 遍历指针
let fast = 1;
//有效数组长度指针
let slow = 1;
while (fast < n) {
if (nums[fast] !== nums[fast - 1]) {
// 前后不同时,更新有效数组及其长度
nums[slow] = nums[fast];
slow++;
}
// 更新遍历指针
fast++;
}
// 返回排序好的数组有效长度
return slow;
};
console.log(removeDuplicates(array));
console.log(array);
3.衍生
这里附赠一个去重方法
function arrDeduplication(arr) {
return arr.filter((item, index) => array.indexOf(item) === index);
}