Leecode力扣27数组移除元素
题目链接:力扣
最终可运行的代码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;}
};