杂记杂记,顾名思义,就是把在我个人做题中用到的vector相关知识记录一下。我比较笨只能用这种方法,不然记不住
相关题目
思路
难点是这么一句话“不要使用额外的空间,你必须在原地修改输入数组 并在使用 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)这个是题目要求