双指针的初步了解
双引用的初步了解 10.14
今天在力扣上刷题,第一次了解到了双引用的概念,如图
对于这个题,我一开始的思路是从0到size-1一步步遍历,如果找到值为val的,就删去,然后让计数器加1,最后输出计数器。但是不知道为什么总是报错
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int flag;
int ret=0;
for(int i=0;i<nums.size();++i){
if(nums[i]==val){
++ret;
nums.erase(nums.begin()+i);
}
}
int ans=nums.size()-ret;
return ans;
}
};
这是初始代码,我还没搞明白为什么会出错e
但是如果用双引用就比较简便
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int a=0; //设置两个指针,一个从头开始,一个始终指向末尾。
int b=nums.size()-1;
while(a<=b){
if(nums[a]==val){
int temp=nums[a]; //将首尾的值进行调换,并且让b-1,从而实现元素的删除
nums[a]=nums[b];
nums[b]=temp;
--b;
}
else{
++a; //如果不是val,则+1继续遍历
}
}
return b+1; //由于b始终指向最后一个元素,而数组的下标从0开始,所以要+1
}
};