【初级算法|数组01-删除排序数组中的重复项

160 阅读1分钟

删除排序数组中的重复项

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;
};

总结:

使用双指针方式,一个指针是指向变化后的数组的指向,一个指针是针对原数组遍历的指向。数组是引用类型,所以如果在方法内改变了数组的值后,方法外再使用数组时就会得到一个处理后的数组。