力扣26:删除有序数组中的重复项

原题链接

class Solution {
    public int removeDuplicates(int[] nums) {
        int firstDuplicateMark = 0;
        //数组已经是升序了
        for (int i = 1;i < nums.length; i++) {//总是数组中要比较的前一个数
            if(nums[i-1]==nums[i])
                continue;
            //定位到不重复的数据
            //这里选择不处理“刚好下一个不重复”的情况
            nums[++firstDuplicateMark]=nums[i];
        }
        return firstDuplicateMark+1;
    }
}

在这里插入图片描述
这题比较简单。我使用for循环构建双指针,实际上和官方解答思路是一致的;但是官方解答在多定义了一个int类型变量的情况下居然内存的表现比我好,这是我没搞懂的。
当然我的源代码还可以继续改进:针对输入先进行if判断,如果nums为null或者长度为0的话,可以直接返回0,这样子程序可以更快。

class Solution {
    public int removeDuplicates(int[] nums) {
        int n = nums.length;
        if (n == 0) {
            return 0;
        }
        int fast = 1, slow = 1;
        while (fast < n) {
            if (nums[fast] != nums[fast - 1]) {
                nums[slow] = nums[fast];
                ++slow;
            }
            ++fast;
        }
        return slow;
    }
}

在这里插入图片描述
时间复杂度 O ( n ) O(n) O(n),因为要遍历整个数组;空间复杂度 O ( 1 ) O(1) O(1),只用使用常数个额外空间。

顺便补充扩展,假设每次保留至多两位重复的数字而非一位呢?有个前辈给出了扩展

class Solution {
    public int removeDuplicates(int[] nums) {   
        return process(nums, 2);
    }
    int process(int[] nums, int k) {//k为保留的数位
        int idx = 0; 
        for (int x : nums) {
        	//数组的前k位无论什么条件都是直接复制
        	//idx表示已排序数组的最后一个元素坐标
            if (idx < k || nums[idx - k] != x) nums[idx++] = x;
        }
        return idx;
    }
}

对于此类问题,我们应该进行如下考虑:

  • 由于是保留 k 个相同数字,对于前 k 个数字,我们可以直接保留。
  • 对于后面的任意数字,能够保留的前提是:与当前写入的位置前 k 个元素进行比较,不相同则保留。

idk指向元素待插入位置
注意这种方法是必须要求数组已经升序排序的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值