数组中移除元素并不容易!使用快慢指针(双指针)

数组理论基础

  对于刚刚接触数组操作的同学来说,删除数组中某个特定元素感觉是很容易的,理所应当就是直接删除这个元素就行,就像【1,2,3,4,5】这个数组来直接删除元素3

直接删除数组元素

1245

但其实这样是不对的,数组是一个连续的类型相近的元素的一个集合,每一个元素都应该是连续的不能有空缺,所以对于删除数组中某个元素,只能采用覆盖的方法:

覆盖的方式删除数组某个元素

12455

即将元素3所在位置覆盖为元素4元素4原来所在位置覆盖为5,元素中最后一个元素可以不用处理,我们直接返回新数组前4位即可(原数组5个元素删除元素3还剩4个),即【1,2,4,5】,这样就可以知道采用元素覆盖也可以实现数组的元素删除

双指针思路 

  那我们知道了采用覆盖的方法删除数组的某个元素,那我们代码可以采用双指针的方法来进行元素的覆盖,我们可以定义fast快指针和slow慢指针,而fast指针用来寻找新数组中所需要的元素,如上面部分得到的新数组【1,2,4,5】的新元素1,2,4和5,即删除目标值3之后剩下的元素。那我们找到了新数组所需要的新元素之后,就要赋值给新数组,而slow指针就是新数组的下标值,所以就可以把fast指针的元素赋值给slow指针的元素就可以了,接下来我就使用数组arr【1,2,3,4,3,5】实现删除元素3并返回新数组的长度给同学们来模拟这一过程:

  第一步就是初始化我们的两个指针,fast指针用来寻找新数组中所需要的元素,所以我们从下标0开始寻找到数组的最后一位,即for(let fast = 0;fast<arr.length;fast++),而我们的slow指针是新数组的下标,所以也从下标0开始即slow=0;

let slow = 0;
for(let fast = 0;fast < arr.length;fast++){
}

arr数组删除元素3

fast指针
123435
slow指针

我们要找新数组所需要的元素,即不包括3的所有元素(1,2,4,5),所以当fast指针指向的元素不等于元素3时,就是新数组所需要的元素,即arr[fast]!==3,再将该元素赋值给新数组,即arr[slow]=arr[fast],然后slow指针向后移动一位,即slow++;

let slow = 0;
for(let fast = 0;fast < arr.length;fast++){
     if(arr[fast]!==3){
          arr[slow] = arr [fast];
          slow++;
      }
}

arr数组删除元素3

fast指针
123435
slow指针

arr数组删除元素3

fast指针
124435
slow指针
arr数组删除元素3
fast指针
124435
slow指针

如当fast指针移动到下标2时,指向的元素为3不是新数组的元素,不用赋值,继续遍历,到指向下标3时,元素为4,是新数组的元素,就赋值给slow指针的元素

arr数组删除元素3
fast指针
124435
slow指针
arr数组删除元素3
fast指针
124435
slow指针
arr数组删除元素3
fast指针
124535
slow指针
如当 fast指针移动到 下标4时, 指向的元素为3不是新数组的元素,不用赋值,继续遍历,到指向 下标5,最后一位时, 元素为5是新数组的元素,就 赋值给slow指针的元素。此时for循环结束,我们发现 指针slow指向的下标值即为新数组【1,2,4,5】的长度,可 直接返回,即 return slow
let slow = 0;
for(let fast = 0;fast < arr.length;fast++){
     if(arr[fast]!==3){
          arr[slow] = arr [fast];
          slow++;
      }
}
return slow;

 代码实战

  原题链接

  我们可以通过一道金典的leetcode移除数组特定元素并返回新数组长度的题目来进行代码实战:

javascript

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function(nums, val) {
    let slow = 0;
for(let fast = 0;fast < nums.length;fast++){
     if(nums[fast]!==val){
          nums[slow] = nums[fast];
          slow++;
      }
}
return slow;
    
};

C++

#include <vector>

int removeElement(std::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;
}

Java

import java.util.ArrayList;
import java.util.List;

public class Solution {
    public int removeElement(List<Integer> nums, int val) {
        int slow = 0;
        for (int fast = 0; fast < nums.size(); fast++) {
            if (nums.get(fast) != val) {
                nums.set(slow, nums.get(fast));
                slow++;
            }
        }
        
        return slow;
    }

}

如果同学们还有疑问,可观看这个视频,欢迎同学们交流讨论,谢谢大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值