27. 移除元素
题目:移除元素
示例和提示:
解法:
1. 暴力解法
//暴力解法: //实际上就是遍历数组找到需要删除的元素,然后再嵌套一层循环将该元素后面的依次向前覆盖。 class Solution { public: int removeElement(vector<int>& nums, int val) { //为了不让每次循环都调用size()函数: 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--; i--; size--; } } return size; } };
2. 快慢指针
//快慢指针法: //很酷很丝滑的解法,快指针勇往无前的遍历,慢指针负责将快指针指向位置的元素复制到自己指向的位置, //当快指针指向位置的元素需要删除时,慢指针停止赋值,直到快指针再次指向一个不需要删除的元素的位置。 class Solution { public: int removeElement(vector<int>& nums, int val) { int fastPoit = 0; int slowPoit = 0; int size = nums.size(); for( ; fastPoit < size; fastPoit++) { if(nums[fastPoit] != val) { nums[slowPoit] = nums[fastPoit]; slowPoit++; } } //slowPoit此时的指向正是新数组末尾的下一个位置,因为slowPoit++ //是放在赋值最后执行的,所以刚好也就是新长度: return slowPoit; } };
😄 创作不易,你的点赞和关注都是对我莫大的鼓励,再次感谢您的观看😄