C++初学者笔记之STL::vector杂记(二)

文章介绍了如何使用C++的vector容器解决力扣第26题,即在不使用额外空间且原地修改的条件下删除有序数组中的重复项。作者提到了两种方法,一是使用vector的earse()函数,二是采用双指针技巧。两种方法的时间复杂度和空间复杂度都进行了分析。

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

杂记杂记,顾名思义,就是把在我个人做题中用到的vector相关知识记录一下。我比较笨只能用这种方法,不然记不住

相关题目

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

思路

难点是这么一句话“不要使用额外的空间,你必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成“

这就让我一开始想到的构建数组复制数组的思路行不通

1️⃣使用earse()函数

vector自带的earse()函数,用来删除指定位置的函数,并且返回删除位置之后的一位,实际写法很不好用

int removeDuplicates(vector<int>& nums) {
    if(nums.empty()) return 0;
    vector<int>::iterator itor;
    int bj = nums[0];
    for(itor = nums.begin() + 1; itor != nums.end(); ){
        if(*itor == bj) itor = nums.erase(itor);
        else{
            bj = *itor;
            itor++;
        }
    }
    return nums.size();
}

这里将仅有的存储空间bj用来记录当前nums[i]是否和之前记录的一致,如果不一致就删除掉,最后返回删除后的nums的大小

用到的函数:erase(first, end),删除范围是从first到end的所有元素,并返回删除位置之后的一位,这就要求能够有赋值对象,也可以erase(a)删除位置a的元素

迭代器iterator,和指针类似,目前我还接触到的不多,并不知道erase()返回的是什么类型,应该是*int,用迭代器只是确保不会出错,调用之后itor自动+1,就不用担心移动的问题

小总结:总时间复杂度位O(n^2)在一次for循环中执行erase()时间复杂度为O(n),空间复杂度被题目控制为O(1)

2️⃣双指针

构建两个指针,一个负责遍历查找一个负责记录并修改数组,分别命名为fast和slow

初始位置都已1,slow为1是因为位置0必会是元素的第一个(当然需要做条件判断),fast为1是为了比对是否和位置0元素一致

在循环中fast开始遍历,当出现nums[fast-1]与nums[fast]不一致时,意味着出现了新元素,将slow所指位置元素变为nums[fast]并+1

最后返回slow,slow记录的nums部分属于被更改的数组

int n = nums.size();
if(n == 0) return 0;
int fast = 1, slow = 1;
while(fast < n){
    if(nums[fast - 1] < nums[fast]){
        nums[slow] = nums[fast];
        slow++;
    }
    fast++;
}
return slow;

仅有的存储空间被用来记录slow和fast

小总结:时间复杂度O(n),进行了一次for循环,空间复杂度为O(1)这个是题目要求

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值