leetode面试经典150题——02移除元素

题目:移除元素

描述:给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
leetcode链接

方法一:采用vector的erase方法,直接删除数组中值为val的元素

int removeElement(vector<int>& nums, int val) {
	vector<int>:: iterator it;
	for(it = nums.begin();it!=nums.end();){
		if(*it == val){
			nums.erase(it);
		}else{
			it++;
		}
	}

	return nums.size();
}

erase和remove的区别:erase方法会删除该元素并且释放空间,因此erase函数返回的值是指向下一个元素的地址。
而remove函数的删除是用后面的元素填充该待删除的元素,相当于把后面的元素都整体往前移动一位,但是数组的空间没有变。
此题要求的是删除后数组的长度,因此应该采用erase函数
补充:关于迭代器的定义,vector::iterator it 和auto it都可以

方法二:双指针法
设置两个指针p1,p2,用p1来判断当前元素是否等于val,p2来指向下一个要赋值的元素,初始p1,p2都指向数组起始位置。那么就有两种情况
1.当p1 != val,此时把p1的值赋给排p2,并且p1和p2都向右移动一位
2.当p1 ==val,此时p1向右移动一位,p2不动,表示不会把此元素加入到新的数组中
循环结束后,p2指向新数组的最后一个元素的下一个位置,那么新数组的长度即为p2`

int removeElement(vector<int>& nums, int val) {
	int p1 = 0,p2 = 0;
	while(p1<nums.size()){
		if(nums[p1] != val){
			nums[p2++] = nums[p1++];
		}else{
			p1++;
		}
	}

	return p2;
}

方法三:双指针优化
在方法二中,我们会大量反复赋值需要留下来的元素,考虑题目说可以打乱数组中原来元素的顺序,我们只需要把值为val的元素用后面的元素填充即可,并不需要像方法二那样保持原来数组的顺序不变,因此我们设置两个指针p1,p2,p1指向数组头部,p2指向数组尾部,当p1的值为val时,我们把p2的值赋给p1,p2向左移动一位,当p1的值不为val时,p1向右移动一位,循环结束后,p1指向的是需要留下来的数组元素的最后一位。

int removeElement(vector<int>& nums, int val) {
	int p1 = 0,p2 = nums.size()-1;
	while(p1<=p2){
		if(nums[p1] == val){
			nums[p1] = nums[p2--];
		}else{
			p1++;
		}
	}
	return p1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值