题目来自力扣初级算法,供个人学习使用。
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);
}
本文介绍了如何通过双指针技术解决力扣初级算法中的一道题目,要求在保持升序排列的同时,原地删除有序数组中的重复元素。题目解析指出,由于数组有序,可以设置两个指针,一个遍历数组,一个确定有效数组长度,当遍历指针遇到不重复元素时,更新有效数组。此外,还提供了一个基于数组filter方法的去重实现作为衍生方法。

1110

被折叠的 条评论
为什么被折叠?



