LeetCode[Array]: Remove Element

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.

方案一

这个题目我首先想到的方案是:从前往后遍历,将依次出现的目标用数组尾部不是目标的元素替换,因为题意明确指出元素顺序可以改变。

具体实现方法是:设置两个迭代器,一个用来前向扫描,一个用来后向扫描,前向扫描找到下一个目标,后向扫描找到最后那个非目标元素,二者交换(实际上无需交换,只需将最后那个元素赋给前向目标地址即可,因为题意明确指出超出新长度部分的元素不用管)。如此循环直至两迭代器相逢。

具体代码如下:

 
 
C++ code
class Solution { public: int removeElement(int A[], int n, int elem) { int forwardScan = 0, backwardScan = n - 1; while (forwardScan <= backwardScan) { if (A[forwardScan ] != elem) forwardScan ++; else if (A[backwardScan ] == elem) backwardScan--; else A[forwardScan++] = A[backwardScan--]; } return backwardScan + 1; } };

方案二

Discuss里面看到一种解决方案跟上面的类似,但是实现方法有两点区别:

  • 无需再用一个后向迭代器,直接用数组长度n即可;
  • 无需从后面找到最后那个非目标元素,直接以之替换前向目标元素,下一次仍然从该元素开始扫描即可。

具体实现方法如下:

 
 
C++ code
int removeElement(int A[], int n, int elem) { int i = 0; while (i < n) { if (A[i] == elem) A[i] = A[(n--) - 1]; else i++; } return n; }

方案三

在Discuss里面还看到另外一种解决方案:无需使用后向迭代器,直接将非目标元素往前挪,覆盖掉所有目标元素即可。

这种方法有利有弊:

  • 缺点:挪动了大量元素,如果第一个元素就是目标的话,那么整个数组都需要重新赋值;
  • 优点:保证了原来数组的顺序。

具体实现方法如下:

 
 
C++ code
int removeElement(int A[], int n, int elem) { int begin=0; for(int i=0;i<n;i++) if(A[i]!=elem) A[begin++]=A[i]; return begin; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值