力扣:删除排序数组中的重复项(c++)

Posted 解忧杂活铺子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣:删除排序数组中的重复项(c++)相关的知识,希望对你有一定的参考价值。

题目:


给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。


不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

解:


思路:


使用双指针,一个指向待比较元素(慢指针),一个指向当前元素(快)。当前元素如果和待比较元素相同,就继续比较下一个快指针,如果不同,就将待比较的元素的下一个替换成当前元素,待比较指针前移。这样待比较元素之前的所有元素都可保证不重复。直至遍历完数组。此时,待比较元素的位置就为新数组长度+1(因为位置从0开始所以+1)

步骤:


步骤1:判断快指针和慢指针的值


相同:慢指针位置不变,快指针前移一位。指向了 位置 2


步骤2:继续判断,发现二者值不相同。将 2 指向的值放入慢指针指向的下一位。慢指针、 快指针前移一位。慢:1   快:3


步骤3:继续判断,二者值相同。慢指针位置不变,快指针前移一位,指向了位置 4


步骤4:继续判断,二者值相同。慢指针位置不变,快指针前移一位,指向了位置 5


步骤5:继续判断,发现二者值不相同。将 5 指向的值放入慢指针指向的下一位。慢指针、 快指针前移一位。慢:2   快:6


步骤6:继续判断,二者值相同。慢指针位置不变,快指针前移一位,指向了位置 7


步骤7:继续判断,发现二者值不相同。将 7 指向的值放入慢指针指向的下一位。慢指针、 快指针前移一位。慢:3   快:8


步骤8:继续判断,二者值相同。慢指针位置不变,快指针前移一位,指向了位置 9


步骤9:继续判断,发现二者值不相同。将 7 指向的值放入慢指针指向的下一位。慢指针前移一位。慢:4   遍历结束。返回慢指针长度+1

int removeDuplicates(vector<int>& nums){ int i = 0; // 先判空 if (nums.size() == 0) return 0; for (int j = 0;j < nums.size();j++) { // j 作为快指针去辨别是否为重复元素 if (nums[j] != nums[i]) // 是重复的就不能进行替换,不重复才替换 { nums[i + 1] = nums[j]; i++; } } return i + 1;}


以上是关于力扣:删除排序数组中的重复项(c++)的主要内容,如果未能解决你的问题,请参考以下文章

力扣:初级算法——26. 删除排序数组中的重复项

力扣算法笔记—1_删除排序数组中的重复项(数组)

力扣题解 26th 删除排序数组中的重复项

力扣题解 26th 删除排序数组中的重复项

从 C++ 中的排序数组中删除重复项

删除有序数组中的重复项--力扣