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

删除排序数组中的重复项

问题描述

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

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

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

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

解题思路

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

图解:(来源:【双指针】删除重复项-带优化思路
【46】(快慢指针)删除排序数组中的重复项(LC 26)
代码:

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 的值。

上一篇:态路小课堂丨QSFP-DD封装模式光模块接口类型:LC/MPO12/MPO16/MPO24/CS/C


下一篇:洛谷 P3920 [WC2014]紫荆花之恋