代码随想录 leetcode 27. 移除元素

113 阅读1分钟

27. 移除元素 - 力扣(LeetCode)

数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili

数组是一块连续的空间 因此不能直接把值删了,而是应该删除一个数之后把后面的数字向前挪动。 因此我们直接使用erase()删除的话会超时:

        for(auto it=nums.begin();it!=nums.end();)
        {
            if(*it==val)
            {
                it=nums.erase(it);
            }
        }
        return nums.size();
    }

image.png

因为erase()并不是O(1)复杂度,它的底层是把这个数删除之后把后面的数向前挪动,复杂度是O(n)。/

思路1 双指针

fast遍历数组 寻找新数组需要的元素(!=val的元素)

slow代表新数组

fastslow都指向同一个数组,如图(a-01):

image.png

fast把不是val的数全部给slow,slow就一定是一个满足题目要求的不包含Val重复值的新数组。

fast下标所在值是新数组slow要的元素时,fast就把值给slow,然后fastsolw++ 当fast找到的值吧是新数组要的元素时,slow停止++,fast++,跳到下个元素,如图(a-02)演变为(a-03)的过程:

image.png

此时fast所指向的3是新数组slow所要的元素,fast把4给给slow,然后fastslow都++,如图(a-04)演变为(a-05)-(a-06)):

image.png

3不是新数组slow要的元素,fast++,slow停止++。然后fast=5,是新数组要的元素,把5给给slow:

image.png 此时slow所在的位置就是新数组的最后一个新表,return slow即可。

code

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {


int slow=0;
for(int fast=0;fast<nums.size();fast++)
{
    if(nums[fast]!=val)
    {
 nums[slow]=nums[fast];
         slow++;
    }
   
}

return  slow;
    }
};