题目的意思是不要额外新增数组,消耗内存。
一开始采用了笨方法,即删除一个字符时,就再循环一遍。那么就很浪费时间,时间复杂度应该是。
int benfangfa(vector<int>& nums, int val)
{
int num = nums.size();
int num1 = nums.size();
for(int i = 0; i < num1; i ++)
{
for(int j = 0; j < num; j++)
{
if(nums[j] == val)
{
nums.erase(nums.begin() + j );
num --;
break;
}
}
}
cout << "num is " << num << endl;
return num;
}
然后精简了一下,在循环中当向量值等于需要消除的值时,令变量i置为0,相当于重新循环。但是这里犯了一个错误,for循环是执行完括号内容再++的,所以此处应该令i = -1,这样的话执行完i+1刚好等于0。
int benfangfa2(vector<int>& nums, int val)
{
int num = nums.size() ;
for(int i=0; i < num ; i ++)
{
if (nums[i] == val) {
nums.erase(nums.begin() + i);
i = -1;
num --;
}
}
}
好了,接下来看了看别人的思路,双指针,貌似这个方法比较好,双指针的意思就是,一个指针指向比较小的元素,一个指针指向比较大的元素。将不等于val的元素从索引0处开始覆盖数组,这样时间复杂度就从下降为
int haofangfa(vector<int>& nums,int val)
{
int size = 0;
for(int i = 0; i < nums.size(); i ++) {
if (nums[i] != val)
{
nums[size++] = nums[i];
}
}
cout << "size is :" << size << endl;
}
知识点:
- vector消除指定元素:
vevtor.erase(vector.begin() + 2);//指定消除第三个元素
- 双指针的用法
nums[size++] = nums[i]; // 等式左边索引和右边不同
来源:CSDN
作者:Hecttttttttt
链接:https://blog.csdn.net/Hanghang_/article/details/104523665