排序数组去重

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

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

你不需要考虑数组中超出新长度后面的元素。

本文着重解答,更多题目相关详细描述参见原文:LeetCode中国-从排序数组中删除重复项

分析

1、题目要求在O(1)额外空间条件下完成,即不能借助其他数组
2、给定的是排序数组,即:重复项是连续的
3、需要给出的是去重后的新数组长度而不用关心之后的元素情况:我们知道数组的长度是不可变的,假设给定数组为:[1,2,2,3],经某种处理后的数组应为:[1,2,3,x],给出的答案应为 3 ,最后一个元素是什么不影响解

分解演算

数组问题常用的解法是记录、移动下标,而分解演算则是获得解法的有效路径,脑力强者可直接在脑中计算,我等普通人只能在纸上演算。
假设给定数组为a=[1,1,2,3,3,3,4],我们必须要经过某种处理来获得目标数组:b=[1,2,3,4,x,y,z],x,y,z暂定,下面进行分解:

第一步处理目标:使a[1] = 2 即 a[1] = a[2];数组变为:[1,2,2,3,3,3,4];
第二步处理目标:使a[2] = 3 即 a[2] = a[3];数组变为:[1,2,3,3,3,3,4];
第三步处理目标:使a[3] = 4 即 a[4] = a[6];数组变为:[1,2,3,4,3,3,4];
处理完成

总结以上过程,得出结论:遍历数组,当出现重复项时,把重复项中第二位替换为后面不重复元素。以刚才的数组为例:a[0],a[1]为重复项,只需把a[1]替换为不重复的项即[a2]即可。

解答

定义一个下标index为需要替换的项,替换完成后移到下一位置,代码如下:

    public int removeDuplicates(int[] nums) {
        if(nums.length == 0){
            return 0;
        }
        int index = 1;
        for(int i = 1;i<nums.length;i++){
            if(nums[i] != nums[i-1]){
                nums[index] = nums[i];
                index++;
            }
        }
        return index;
    }

猜你喜欢

转载自www.cnblogs.com/daozhang/p/9178794.html