题目:删除有序数组中的重复项
笔记 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 }