一、双指针
右指针指向当前要处理的元素,左指针指向下一个将要赋值的元素。
如果右指针指向的元素!=val,将右指针的元素复制到左指针位置,然后将左右指针同时右移
如果右指针指向的元素==val,左指针不动,右指针右移一位。
class Solution {
public int removeElement(int[] nums, int val) {
int n = nums.length;
int left = 0;
for (int right = 0; right < n; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
}
二、双指针优化
如果要移除的元素恰好在数组的开头,例如序列 [1,2,3,4,5],当val=1,我们需要把所有元素左移一位,题上说【元素的顺序可以改变】。实际上可以把5移到开头,5234。
如果左指针的元素等于val,将右指针的元素复制到左指针的位置,然后右指针左移一位。
方法二避免了需要保留的元素的重复赋值操作。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int left = 0, right = nums.size();
while (left < right) {
if (nums[left] == val) {
nums[left] = nums[right - 1];
right--;
} else {
left++;
}
}
return left;
}
};