删除排序数组中的重复项
Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
思路分析
原本的数组已经是一个升序排序的数组,所以可以按顺序遍历,并和上一个数据做比较,如果和上一个数据一样则说明是重复的元素,可删除,若不一致则保存到数组中。
像在 Golang / Java 数组长度一旦初始化后长度都将固定,就不能改变长度。所以可以定义一个新的数组用来存储不重复的数据。
但是重新定义一个临时数组用来存储的话,就是额外申请了空间。如果必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。所以可以使用双指针,并在原来的数组上进行修改,仅需返回最后新的数组的长度。
AC 代码
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function(nums) {
let j=0;
for(var i=1; i<nums.length;i++){
if(nums[j] != nums[i]){
nums[j+1]= nums[i];
j++;
}
}
return j+1;
};
总结:
使用双指针方式,一个指针是指向变化后的数组的指向,一个指针是针对原数组遍历的指向。数组是引用类型,所以如果在方法内改变了数组的值后,方法外再使用数组时就会得到一个处理后的数组。