int removeDuplicates(int* nums, int numsSize) {
if(numsSize == 0)
return 0;
int fast = 1;
int slow = 1;
while(fast < numsSize) {
if(nums[fast] != nums[fast-1]) {
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
-
函数签名:
int removeDuplicates(int* nums, int numsSize)
: 这个函数接受一个整数数组nums
和数组的大小numsSize
作为参数,并返回去除重复元素后的新数组的长度。
-
特殊情况处理:
if(numsSize == 0) return 0;
: 如果数组为空,直接返回0,因为没有重复元素可去除。
-
双指针法:
- 使用两个指针
fast
和slow
分别表示快指针和慢指针。初始时两者都指向数组的第二个元素(索引1)。
- 使用两个指针
-
遍历数组:
- 使用
while
循环遍历整个数组,由于数组已经排序,重复的元素会相邻。
- 使用
-
去除重复元素:
if(nums[fast] != nums[fast-1])
: 检查当前元素是否与前一个元素重复。如果不重复,将当前元素复制到慢指针所在位置,并递增慢指针slow
。
-
返回结果:
- 函数最终返回慢指针的值
slow
,即去除重复元素后的新数组的长度。
- 函数最终返回慢指针的值
这个算法的时间复杂度是 O(n),其中 n 是数组的大小。由于它只使用了常量级别的额外空间,因此空间复杂度是 O(1)。
普通方法
#include <stdio.h>
int main()
{
int arr[]={1,1,1,2,3,3,4,4,5};
int i=0,j=0,k=0;
int count =0;
for(i=0;i<9-count;i++)
{
for(j=i+1;j<9-count;j++)
{
if(arr[i] != arr[j])
{
break;
}
else
{
k = j;
while(k!=8-count)
{
arr[k] = arr[k+1];
k++;
}
count++;//删除数组个数
j--;
}
}
}
for(i=0;i<9-count;i++)
{
printf("%d ",arr[i]);
}
printf("\n");
return 0;
}