LeetCode--27.移除元素
解题思路:
1.获取信息:
给定一个数组和一个值,删除数组中等于这个值的值
要求是,返回数组中不等于这个值的数的数目
并且要求在数组上删除,不能使用额外辅助空间
还是给了评测标准(你可以根据它的原理来实现越狱,但不建议,还是老老实实地才能磨练自己哦)我们知道,它是根据你返回的数组中不等于那个值的数的数目来进行查验进行删除后的数组的前几个元素是否与正确答案一致来进行判别的
所以,数组的大小和除数组前几个元素外的其他元素并不重要
2.分析题目:
26题是删除数组中重复的项,与这道题类似,那我们可以尝试使用一下双指针法
我下面不止有一种方法,各个方法我想借着代码来帮助你理解,在这里就不过多阐述
有时候碰见一些相似的题,也许它们所考查的方向其实大差不差,可以比对着理解哦
3.示例查验
示例1和示例2:数组的大小和除数组前几个元素外的其他元素并不重要
4.尝试编写代码:
(1)双指针法
思路:准备两个指针,一个放在数组的首位,一个放在数组的末尾,前面的指针查找等于val的数,后面的指针查找不等于val的数,两个指针都找到之后就交换这两个数,再将前面的指针后移一位,后面的指针前移一位,再重复上面的操作
当后面的指针比前面的指针靠前的时候,就退出循环,以下是完整代码
class Solution {
public:int removeElement(vector<int>& nums, int val) {int p1=0,p2=nums.size()-1;//准备两个指针while(p1<=p2){//当后面的指针小于前面的指针时if(nums[p1]!=val)p1++;//前面的指针查找等于val的数if(nums[p2]==val)p2--;//后面的指针查找不等于val的数if(p1<p2&&nums[p1]==val&&nums[p2]!=val){//如果满足括号里面的条件,就进行交换swap(nums[p1],nums[p2]);//其实也不用非得交换,直接赋值也行,毕竟余下的元素不重要p1++;p2--;}}return p2+1;//返回数组中不等于val的数的数目}
};
(2)快慢指针法
思路:也是准备两个指针,两个指针的起点都在数组的首位,其中快指针向后查找不等于val的值,查找到了之后,覆盖慢指针指向的数,再将慢指针后移一位,快指针继续查找
以下是完整代码
class Solution {
public:int removeElement(vector<int>& nums, int val) {int slow=0;//慢指针for(int fast=0;fast<nums.size();fast++){//快指针if(nums[fast]!=val)nums[slow++]=nums[fast];}return slow;}
};
(3)反骨法
思路:它说不让用辅助存储空间,你要不要用?要不要用?
当然可以使用,但是不建议,耍小聪明始终上不了大雅之堂哦
所以,看看就可以了,以下是完整代码
class Solution {
public:int removeElement(vector<int>& nums, int val) {vector<int>res;//准备辅助存储空间for(int& num:nums){//遍历数组if(num!=val)res.push_back(num);//如果某个值不等于val,就放入res中}nums.swap(res);return nums.size();}
};