应用题-数组专题-原地移除元素 (双指针 两种写法)
相向指针
```python
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
# i 从左往右遍历 找到等于target则停止
# j 从右往左遍历 找到不等于target则停止
# 交换此时 i和j的元素
i = -1
j = len( nums )
# i j 初始值主要是为了操作的统一
# 当内层while循环找到合适的ij位置时 进行交换
# 此时ij位置时交换好的值 再次进行内层while时 应当是从两者的下一个开始
while i < j:
i += 1
while i < j and nums[ i ] != val: i += 1
j -= 1
while i < j and nums[ j ] == val: j -= 1
if i < j: nums[ i ], nums[ j ] = nums[ j ], nums[ i ]
# 若i==j说明i,j最终停留的位置等于val 否则两者错开
return j if j == i else j + 1
```
**上述写法改变了元素的相对位置**
接下来通过快慢指针来实现,保证元素的相对位置。
```python
class Solution:
def removeElement(self, nums: List[int], val: int) -> int:
slow = 0 # slow是答案区的边界
n = len( nums )
for fast in range( 0, n ):
if nums[ fast ] != val:
# 答案区边界变更
nums[ slow ] = nums[ fast ]
slow += 1
return slow
```