【46】(快慢指针)删除排序数组中的重复项(LC 26)

删除排序数组中的重复项

问题描述

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

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

注:这里返回的是数组的新长度length,输出就输出前length个数字,所以需要把前面重复的元素用不重复的元素替换掉。

例子:
在这里插入图片描述

解题思路

根据题解,将采用快慢指针的思想,快指针指向新数组的最后一个元素,慢指针按顺序遍历原来数组的元素,当快慢指针所指元素不相同时就将慢指针所指接到快指针所指的下一位,并将快指针+1;若俩指针所指元素相同,则慢指针+1,无序接重复元素到新数组中。

图解:(来源:【双指针】删除重复项-带优化思路
在这里插入图片描述
代码:

class Solution {
    
    
    public int removeDuplicates(int[] nums) {
    
    
        int n = nums.length;
        if(n==0) return 0;
        int i=0;
        for(int j=1;j<n;j++){
    
    
            if(nums[i] != nums[j])
                nums[++i] = nums[j]; //注:这里不能用i++
        }
        return i+1;
    }
}

时间复杂度:O(n)
空间复杂度:O(1)

小总结

i++ :先使用 i 的值,再将其加一;
++i:先将 i 自增1,再使用自增后的 i 的值。

猜你喜欢

转载自blog.csdn.net/qq_43424037/article/details/114556996