数组理论基础
对于刚刚接触数组操作的同学来说,删除数组中某个特定元素感觉是很容易的,理所应当就是直接删除这个元素就行,就像【1,2,3,4,5】这个数组来直接删除元素3:
直接删除数组元素
1 2 4 5 但其实这样是不对的,数组是一个连续的类型相近的元素的一个集合,每一个元素都应该是连续的,不能有空缺,所以对于删除数组中某个元素,只能采用覆盖的方法:
覆盖的方式删除数组某个元素
1 2 4 5 5 即将元素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指针 1 2 3 4 3 5 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指针 1 2 3 4 3 5 slow指针
arr数组删除元素3
fast指针 1 2 4 4 3 5 slow指针
arr数组删除元素3 fast指针 1 2 4 4 3 5 slow指针 如当fast指针移动到下标2时,指向的元素为3,不是新数组的元素,不用赋值,继续遍历,到指向下标3时,元素为4,是新数组的元素,就赋值给slow指针的元素。
arr数组删除元素3 fast指针 1 2 4 4 3 5 slow指针
arr数组删除元素3 fast指针 1 2 4 4 3 5 slow指针 如当 fast指针移动到 下标4时, 指向的元素为3, 不是新数组的元素,不用赋值,继续遍历,到指向 下标5,最后一位时, 元素为5, 是新数组的元素,就 赋值给slow指针的元素。此时for循环结束,我们发现 指针slow指向的下标值即为新数组【1,2,4,5】的长度,可 直接返回,即 return slow
arr数组删除元素3 fast指针 1 2 4 5 3 5 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;
}
}
如果同学们还有疑问,可观看这个视频,欢迎同学们交流讨论,谢谢大家