LeetCode 26. Remove Duplicates from Sorted Array

本文探讨了在不使用额外空间的情况下,如何有效地从有序数组中去除重复元素,并提供了两种解决方案。一种是直接删除重复元素,但效率较低;另一种是通过计数器记录唯一元素,避免了频繁的结构调整,显著提高了算法的执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

在这里插入图片描述

分析 && 代码

这也是复习的时候感慨的一道好题目,特此记录一下。
题目很简单,要求in place,也不算难,按照我的想法记录一下前一个出现的数字,因为有序,如果之后遇到了相同的,就把后面的删了。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if (nums.size() <= 1) return nums.size();
        // 前一个出现的数字
        int num = nums[0];
        for (auto it = ++nums.begin(); it != nums.end();) {
        	// 重复数字 删除即可
        	// 注意原来的迭代器会失效,不用自增
            if (*it == num) {
                nums.erase(it);
            }
            // 如果不重复 就更新num 同时自增迭代器
            else {
                num = *it;
                it++;
            }
        }
        return nums.size();
    }
};

交了一发
在这里插入图片描述
但是好慢啊,分析一波慢的原因就是在于这种方式会不断的调整vector的结构,因为删除一个元素,vector是需要调整的,当vector很大的时候,这种反复的调整无疑是灾难性的。
能不能不删除呢,可以但是就需要存在新的容器或者数组,但题目要求了in place。
但是注意题目返回的值是int,表示的是最后保留的数组的长度,这就暗示我们可以不开额外vector而是直接利用这个vector,然后记录下去重的数据的长度,至于后面的数字可以不管他。实现的方法就是用一个计数器记住当前去重的数组最后一个元素的下标,如果不同就赋值到数组中它的下一个位置,来看代码就明白了。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if (nums.size() <= 1) return nums.size();
        int len = 1;
        for (int i = 1; i < nums.size(); ++i) {
            if (nums[i] != nums[len - 1]) {
                nums[len] = nums[i];
                len++;
            }
        }
        return len;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值