题目链接:力扣
最终可运行的代码1:暴力法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int index=0;
int num=nums.size();
while(index<=nums.size()-1){
if(nums[index]==val){
int j=index;
num--;
while(j<=nums.size()-2){
nums[j]=nums[j+1];
j++;
}
//这里我没有写nums.pop_back(),会报超出时间限制的错误;
nums.pop_back();
}
else{
index++;
}
}
return num;
}
};
最终可运行的代码2:双指针法
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int index = 0; // 用于插入元素的指针
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != val) {
nums[index] = nums[i];
index++;
}
}
return index;
}
};
卡哥的讲解中,用了for循环,i--和我while循环中的pop_back()也是一个道理!
// 时间复杂度:O(n^2)
// 空间复杂度:O(1)
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--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位
size--; // 此时数组的大小-1
}
}
return size;
}
};