首先得回想起一个重要的知识点,避免走上弯路:
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
知道了这个知识点,我们就好解题了。将查找到的目标元素覆盖即可,可是怎样覆盖呢?
哈!!!聪明的你一定想到了将其后面的元素一个个上移,这必须就得用到我们的循环啦!
废话不多说,直接上代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int size = nums.size();
for(int i = 0; i < size; i++){
if(nums[i] == val){
for(int j = i + 1; j < size; j++){
nums[j - 1] = nums[j];
}
i--;
size--;
}
}
return size;
}
};
还有一种双指针解法,我还没完全理解,等我完全理解了再回来修改一下。
听说这个解法还挺重要的,小伙伴们一定要去尝试一下双指针解法哦!
嘿嘿嘿,我回来啦!小伙伴我似乎比昨天明白一点啦!
咱们不要放弃,如果当天没搞懂,我们放一下,明天再看可能就会有不一样的体会哦!
来我们来说双指针解法:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slowIndex = 0;
for(int fastIndex = 0; fastIndex < nums.size();fastIndex++){
if(val != nums[fastIndex]){
nums[slowIndex++] = nums[fastIndex];
}
}
return slowIndex;
}
};
是不是比之前那个效率高了不少呢?不用进行双循环啦!
我理解的是:定义两个指针,第一个遍历的是fast,然后如果没有目标值slow就跟上和fast一样,然后有目标值slow就在那个目标值上不动,暂且不去跟fast,然后fast移动,进行赋值就好啦!