【leetcode】移除元素——双指针法

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指向的是物理空间上的最后一个元素,覆盖之后空出来的位置放置的还是原来的元素)。

猜你喜欢

转载自blog.csdn.net/Lccca/article/details/129159641