数据结构学习(1)----数组之删除有序数组中的重复项

题目:给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

在这里插入图片描述
做这道题,我开始想复杂了,应该拿到的是有效数组的长度,就不用顾及nums的整个值了。

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
    
    
    let j =0;
    for(let i =0 ;i<nums.length;i++){
    
    
        // 思路:首先一开始 i和j都是0,从第一个开始比
        // 一个指针 i 进行数组遍历,另外一个指针 j 指向有效数组的最后一个位置
        //然后i开始加一变大,j还是0
        // 也就是说,nums[j]还是第一个值,如果nums[i]一直和第一个值相同,那么i的值就一直增大,知道遍历结束
        //当nums[i]的值和nums[j]的值不同了,就意味着后面都不会再出现和这个当前的nums[j]相同的值了,因为这是个递增序列
        //所以当nums[i]出现了不同的值的时候,j的值就要先加1,为什么呢?因为j为0时也就是nums[0]存的是第一个值,j++之后
        //nums[j]===>nums[1]就是第二个不同的值了
        //当然,我们也不用管nums[i]的值了,因为最后只需要得到不重复数组的长度
        if(nums[i]!=nums[j]){
    
    
            j++
            nums[j]=nums[i]
        }
    }
    return j+1 //因为j是数组最后一个位置,所以数组真正的长度还要加1
};

猜你喜欢

转载自blog.csdn.net/weixin_43449246/article/details/128676177