双指针的初步了解

双引用的初步了解 10.14

微信图片_20251014192912

今天在力扣上刷题,第一次了解到了双引用的概念,如图

对于这个题,我一开始的思路是从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

  }

};




posted @ 2025-10-14 20:09  MaoS1mple  阅读(3)  评论(0)    收藏  举报