[leetcode][two pointers] Remove Element

本文介绍了三种在C++中从数组移除指定值的方法,包括使用首尾指针、从后向前扫描以及从前向后扫描等技巧,并详细解释了每种方法的实现原理。

题目:

Given an array and a value, remove all instances of that value in place and return the new length.

The order of elements can be changed. It doesn't matter what you leave beyond the new length.


方法一:首尾指针,若后面出现val,rear前移;前面出现val,用rear的元素填充front,然后front后移rear前移

int removeElement(vector<int>& nums, int val) {
	if (nums.empty()) return 0;
	int n = nums.size();
	int front = 0;//从头遍历数组
	int rear = n - 1;//指向新数组最后一个元素
	while (front < rear){
		if (nums[front] != val){
			++front;
			continue;
		}
		if (front < rear && nums[rear] == val) {
			--rear;
			continue;
		}
		nums[front] = nums[rear];//!!!front所指元素等于val且rear所指元素不等于val才能到这里,若所有元素都不等于val,就不能到这里,rear也不会减小
		++front;
		--rear;
	}
	if (nums[rear] == val) --rear;//!!!front == rear的那个元素没有判断过
	return rear+1;
}

方法二:从后向前扫描,发现val就用数组最后一个元素填充,然后数组长度减一

int removeElement(vector<int>& nums, int val) {
    int n = nums.size();
    for(int i = n - 1; i >= 0; --i){
        if(nums[i] == val){
            nums[i] = nums[n-1];
            --n;
        }
    }
    return n;
}

方法三:从前向后扫描,endNew指向新数组最后一个元素的下一个元素,发现非val元素就用其填充endNew,然后endNew后移一位

int removeElement(vector<int>& nums, int val) {
    int endNew = 0;
    for(int i = 0; i < nums.size(); ++i){
        if(nums[i] != val){
            nums[endNew++] = nums[i];
        }
    }
    return endNew;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值