删除数组元素
在一个无序数组中,将数组中的指定元素删除。将设数组长度为n,其中包含m个只为val的元素,需要将数组中m个值为val的元素删除,剩下长度为n-m的数组,后面m个元素值任意,前面m-n个元素为删除之后的剩余元素。
关键点在于数组的元素不能删除只能覆盖或者替换。
-
直接法
遍历找到需要删除的元素之后,该元素后面的元素一次向前移动,将该元素覆盖。
class Solution { public: int removeElement(vector<int>& nums, int val) { int res = 0, len = nums.size(); for(int i = 0; i < len; i++){ if(nums[i] == val){ len--; for(int j = i; j < len; j++) nums[j] = nums[j+1]; i--; //移动后的第i个位置的元素重新判断是否需要删除 } } return len; } };
-
直接法改进
首先记当前数组的最后一个元素下标为last=len-1,向后遍历寻找需要删除的元素,找到需要删除的元素后,从last向前last–遍历寻找不需要删除的元素位置,找到之后将两者交换,再最后一个元素位置为last = last-1
class Solution { public: int removeElement(vector<int>& nums, int val) { int res = 0, len = nums.size(); int j = len - 1; for(int i = 0; i < len; i++) { if (nums[i] == val) { //j = len - 1; while(j > i && nums[j] == val){ j -- ; } if (j > i){ nums[i] = nums[j]; nums[j] = val; len = j + 1; res ++; j --; } else break; } else res++; } return res; } }; //重新修改后 class Solution { public: int removeElement(vector<int>& nums, int val) { int res = 0, len = nums.size(); int last = len - 1; for(int i = 0; i <= last; i++) { if (nums[i] == val){ while(last > i && nums[last] == val){ last -- ; } if (last >= i){ //此处如果写为>,则输入[0],0时,输出错误结果 nums[i] = nums[last]; //nums[last] = val; last--; } else break; } } return last+1; } };
-
双指针法
用快指针来遍历数组,用满指针来表示遍历到第i个元素时,新数组最后一个元素的位置
class Solution { public: int removeElement(vector<int>& nums, int val) { int last = 0; for(int i = 0; i < nums.size(); i++) if(nums[i] != val){ nums[last] = nums[i]; last++; } return last; } }; //另一种写法,通过统计需要删除元素的数量来确定第i个元素的新位置 class Solution { public: int removeElement(vector<int>& nums, int val) { int numDel = 0; for(int i = 0; i < nums.size(); i++) { if(nums[i] == val) numDel++; else nums[i - numDel] = nums[i]; } return nums.size()-numDel; } };