27.移除元素

🐵 27.移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

思路

基本思想

为了将

所有值为val的元素移除,需要将所有不是val的元素向前移动,以覆盖所有val的元素,逆向思维将问题转化之后,一切迎刃而解,使用双指针解题

fast寻找每一个不是val的元素,一旦找到,slow位置就放置不是val的元素,如果遇到值为val的元素,slow不动,fast向后寻找不是val的元素覆盖slow位置上的元素即可

执行流程

  1. 遍历数组
  2. 遇到不是val的元素,直接将元素搬到slow的位置上
  3. 遇到是val的元素,slow不动,fast向后移动寻找不是val的元素将值为val的元素覆盖
  4. 返回slow的值就是删除之后数组的长度

代码

根据以上分析,得出以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int fast=0,slow=0;
        while(fast<nums.size()){
            if(nums[fast]!=val){//找到不是val的元素
                nums[slow++]=nums[fast++];
            }else{//找到是val的元素
                ++fast;
            }
        }
        //slow就是数组的长度
        return slow;
    }
};

总结

主要是思维的转换,将删除val元素转换为将不是val的元素向前移动,之后只需要找出所有不是val的元素移动即可