class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
int fast=0;
for(fast=0;fast<nums.size();fast++)
if(nums[fast]!=val){
nums[slow]=nums[fast];
slow++;
}
return slow;
}
};
双指针法主要在于理解思想,代码很简单。时间复杂度为O(n)。
首先删除数组中的元素本质上都是覆盖,数组的size会随着删除元素变小,而capacity不会改变。
fast元素遍历数组,如果数组元素不是所要删除的元素,那么slow元素也++到下一个。如果fast遍历到了要删除的元素,则slow不动,fast继续前进直到不是删除的元素位置,slow位置的元素替换成fast位置的元素,slow的位置++(此时fast是不等于slow的)。fast遍历结束后,slow元素位置指向的是新数组的最后一个位置(fast指向的是物理空间上的最后一个元素,覆盖之后空出来的位置放置的还是原来的元素)。