双指针

快慢指针

删除有序数组中的重复项

一个有序数组nums,原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度

int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n <= 2) {
            return n;
        }
        int slow = 2;
        for (int fast = 2; fast < n; ++fast){
            if (nums[fast] != nums[slow-2]){// fast 是读指针,不是写指针。我们无法知道前面已经写了多少个相同的值。只有 slow 才能记录我们已经保留了多少个相同的值。
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }

移除元素

在数组中,原地移除所有数值等于val的元素

int removeElement(vector<int>& nums, int val) {
        int slow = 0;//可写入的下标
        int n = nums.size();
        for (int fast = 0; fast < n; fast++){
            if (nums[fast] != val){
                nums[slow++] = nums[fast];
            }
        }
        return slow;
    }

相向指针

移除元素

在数组中,原地移除所有数值等于val的元素, 相较于使用快慢指针的方法, 这种方法减少了元素的写入

int removeElement(vector<int>& nums, int val) {
        if (nums.size() == 0){
            return 0;
        }
        int left = 0;//数组判断元素和可写入的下标
        int right = nums.size() - 1;//数组末尾的下标
        while (left <= right){
            if (nums[left] == val){
                nums[left] = nums[right--];
            }else{
                left++;
            }
        }

        return left;
    }