力扣:删除排序数组中的重复项(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++)的主要内容,如果未能解决你的问题,请参考以下文章