《LeetCode刷题笔记》Day3——删除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

这种题就是利用双指针法。

先定义一个快指针在前面,再定义一个慢指针在后面,如果快指针扫到的不是Val元素,则前进一格,慢指针的值等于快指针,并且慢指针++ ;

如果快指针扫到了Val元素,则慢指针不动。但是后面还会慢指针的值等于快指针,只是少了一步++

比如

 for (slowIndex = 0; fastIndex < nums.length; fastIndex++) {
            if (nums[fastIndex] != val) {
                nums[slowIndex] = nums[fastIndex];
                slowIndex++;
            }
        }
这里面,每当扫描到快指针的值不等于Val,就大家一起增加;
一旦扫到Val值,那么快指针继续向前,而慢指针不动,同时没有nums[slowIndex]=nums[fastIndex]和slowIndex++这两步;
但继续循环之后,nums{slowIndex]还是会等于nums[fastIndex]。区别在于slowIndex++少了一步,这也就是慢指针和快指针分开的原因。
最后输出慢指针,就是删除之后的数组。
总体代码:
// 时间复杂度:O(n)
// 空间复杂度:O(1)
class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int slowIndex = 0;
        for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {
            if (val != nums[fastIndex]) {
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }
};
posted @ 2021-12-16 22:01  曲海鑫  阅读(59)  评论(0)    收藏  举报