题目:删除有序数组中的重复项

笔记 1#

使用的是双指针

这里如果使用最原始的方法:如果当前元素与上一个相同则删除(erase),会导致O(n^2)的时间复杂度——————erase()会将删除元素后面的元素向前移动

而这里,我们定义了两个指针,一个慢指针(k),一个快指针(i);将两个指针对应的值进行比较,如果不同,就将慢指针后移,同时将慢指针所指元素覆盖为当前元素

在这个方法中,我们并没有真正执行“删除”操作,而是对数组进行了重新排列,将重复的元素放到数组末尾,因为最终的返回值是有效的数字个数,因此末尾的区域也就会变成垃圾数据,不需要再去关心它们

removeDuplicates() 同一份实现已收录于第 26 题解法。

来源:语雀原笔记

笔记 2#

使用的是双指针

这里如果使用最原始的方法:如果当前元素与上一个相同则删除(erase),会导致O(n^2)的时间复杂度——————erase()会将删除元素后面的元素向前移动

而这里,我们定义了两个指针,一个慢指针(k),一个快指针(i);将两个指针对应的值进行比较,如果不同,就将慢指针后移,同时将慢指针所指元素覆盖为当前元素

在这个方法中,我们并没有真正执行“删除”操作,而是对数组进行了重新排列,将重复的元素放到数组末尾,因为最终的返回值是有效的数字个数,因此末尾的区域也就会变成垃圾数据,不需要再去关心它们

 1int removeDuplicates(vector<int>& nums)
 2    {
 3        if(nums.empty()) return 0;
 4
 5        int k = 0;
 6        for(int i = 1; i < nums.size(); i++)
 7        {
 8            if(nums[i] != nums[k])
 9            {
10                k++;
11                nums[k] = nums[i];
12            }
13        }
14        return k + 1;
15    }