移除元素
题目在链接中,这只是一个学习总结不能喧宾夺主。
推荐先看代码随想录的题目和题解,然后看看我的总结,我会尽量用通俗的简单词描述我的思路——其实是我会的高级词不多。
思路
读完题一脸懵,什么叫原地呀?
- 原地指的是不用再定义一个数组进行赋值。
- 仅在原数组中用一个循环遍历原数组进行修改。
那么我们可以考虑两种方法
- 暴力
- 双指针
暴力法
代码如下:
class Solution {
public:
int removeElement(vector<int>& nums, int val){
int size = nums.size();
for (int i=0;i<size;i++){//注意这里的i<size是很关键的,size不断更新,防止访问超过新长度的值,而这个值可能等于目标值,从而导致错误。
if(nums[i]==val){
for(int j=i+1;j<size;j++){
nums[j-1] = nums[j];
}
i--;//这里是因为内循环会把nums[i]更新为下一个值,我们需要重新访问nums[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;
}
};
能力有限,如有问题还望指出。