1. 题意
给定一个数组,把不等于val
的元素全部移动到数组的前面来。
不需要考虑值为val
里的元素。
2. 题解
2.1 同向双指针
我们利用双指针,慢指针指向下一个插入的位置。而快指针不断向前找到首个不为val
的值,找到后将快指针位置值赋给慢指针位置,慢指针右移。当快指针遍历完整个数组时,过程结束。
class Solution {
public:int removeElement(vector<int>& nums, int val) {int l = 0;int r = 0;int n = nums.size();int cnt = 0;for (int i = 0;i < n; ++i) {if ( nums[i] != val) {nums[cnt++] = nums[i];}}return cnt;}
};
2.2 相向双指针
由于同向双指针有一个问题,那就是会重复赋值。比如
a=[1,2,3,4,4], val=4
, 前三个元素就会不断自我赋值。
因此有这种相向双指针的解法,当左边指针指向值为val
,拿右指针指向的值赋值给左指针,右指针左移。左指针指向值不为val
就不断右移。
重复上面的过程直到左右指针的值错开。
class Solution {
public:int removeElement(vector<int>& nums, int val) {int l = 0;int n = nums.size(); int r = n - 1;while ( l <= r) {if ( nums[l] == val) {nums[l] = nums[r];r--;}else {l++;}}return l;}
};
3. 参考
leetcode