leetcode 27. 移除元素

文章介绍了如何使用C++编程语言在vector中删除指定元素的三种方法:一是使用erase函数,二是双重for循环遍历替换,三是采用双指针(快慢指针)策略。文中详细解释了每种方法的工作原理和注意点,并提到了双指针方法的效率优势。
摘要由CSDN通过智能技术生成

2023.5.24

题目描述:

        这道题要求我们原地移除元素 ,我第一反应是想到了vector的erase方法,这里先复习以下vector的几种删除元素的方法:

         这里使用第二种,删除指定位置的元素。但是这里有一点要注意:在删除完当前元素时,后面的元素会向前移动。直接看代码:

第一种方法:erase法(本人解)

class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
        int n = nums.size();
        for(int i=0; i<n; i++)
        {
            if(nums[i] == val)
            {
                nums.erase(nums.begin()+i);
                i--;  //删除完当前元素,后续元素会向前移动。
                n--;  //元素的size也需要-1。 
            }
        }
        return nums.size();
    }
};

         当然,正常来说不应该使用erase函数,这里我在用个笨方法,双重for循环。

第二种方法:暴力解(本人解)

class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
        int n = nums.size();
        for(int i = 0; i < n; i++)
        {
            if(nums[i] == val)
            {
                for(int j = i; j < n-1; j++)
                {
                    nums[j] = nums[j+1];
                }
                n--;
                i--;
            }
        }
        return n;
    }
};

第三种方法:双指针(快慢指针)

        看了下题解的双指针思路,也是自己敲出来双指针的代码了,舒服。

class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
        int i=0, j=0; //双指针
        int n = nums.size(); //记录新数组的元素个数
        while(j < nums.size())
        {
            if(nums[j] != val)
            {
                nums[i] = nums[j];
                i++;
                j++;
            }
            else
            {
                n--;
                j++;
            }
        }
        return n;
    }
};

        双指针思路还是挺迷妙的,这里是定义了一个快指针一个慢指针,快指针走得快,用于遍历原始数组的元素,看看是否等于val值。 而慢指针走的慢,它用来维护新数组(即目标数组)的元素,接受所有满足条件(即元素值不等于val)的元素。

        这里我一开始while循环里写的是j<n,运行发现出错。 然后自己用手推了一下整个过程,很容易就发现这个错误了,于是改成 j<nums.size()了。 因为n是新数组的长度,而我们这里需要的是原始数组(即nums)的长度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值