26. 删除有序数组中的重复项 - 力扣(LeetCode)

法一:暴力解法:
遍历数组,当遇到与前一个元素相同的值时,将后面的元素整体向前移动一位。
注意:每删除一位重复元素,数组的有效长度-1,遍历索引回退一个位置。

cpp
int removeDuplicates(int* nums, int numsSize) {
//判断数组是否为空数组
if (numsSize == 0) {
return 0;
}
int count = numsSize;//记录数组中唯一元素的个数
for (int i = 1; i < count; i++) {
//判断当前元素是否与前一个元素相同,相同就将数组后面的元素整体向前移动一位
if (nums[i] == nums[i - 1]) {
for (int j = i; j < count; j++) {
nums[j - 1] = nums[j];
}
//执行完后,i--,因为删除元素了,索引回退,且数组的有效长度要-1
i--;
count--;
}
}
return count;
}
法二:快慢指针解法
思路:当数组为空时,直接返回0;定义一个变量size,并初始化为0,用来记录数组最终的有效长度,快指针fast起始值为1,慢指针slow起始值为0,当快指针与慢指针指向的值相等时,同时++他们两,反之,将数组中慢指针指向元素赋值给size指向位置,同时,将fast,slow,size都++。最后,将最后一个元素赋值给size指向位置,同时size++,因为无论最后两个元素相同或者不相同,都不会被写入数组。
cpp
//法二:双指针解法
int removeDuplicates(int* nums, int numsSize) {
//判断数组是否为空数组
if (numsSize == 0) {
return 0;
}
//定义变量
int size = 0;//用来记录有效数组的长度
int slow = 0;
for (int fast = 1; fast < numsSize; fast++) {
//当快慢指针指向元素相等时,下标同时++
if (nums[slow] == nums[fast]) {
slow++;
}
else
{
//当快慢指针指向元素不相等时,将数组中慢指针指向元素赋值给size指向元素,fast,slow,size同时++
nums[size] = nums[slow];
size++;
slow++;
}
}
//最后,将最后一个元素的值赋值给size指向位置,同时size++
nums[size] = nums[numsSize - 1];
size++;
return size;
}