删除数组中的重复项(C语言)
1.遍历这个数组的每一个值,再循环这个值之后的每一个值,看是否有重复;
#include <stdio.h>
int removeDuplicates(int nums[], int numsSize)
{
int i,j,k=0;
for(i=0;i<numsSize;i++)
{
int flag=1;
for(j=i+1;j<numsSize;j++)
{
if(nums[i]==nums[j])
{
flag=0;
}
}
if(flag)
{
nums[k++]=nums[i];
}
}
return k;
}
int main()
{
int n,i;
scanf("%d",&n);
int nums[n];
for(i=0;i<n;i++)
{
scanf("%d",&nums[i]);
}
printf("%d",removeDuplicates(nums,n));
return 0;
}
这个时间复杂度为O(n^2)。
2.通过双指针实现
定义两个指针,left和right。
left指向0位置,right指向1位置,right通过不断右移实现遍历数组。
当nums[right]=nums[left]时,left不动,right继续右移;
当nums[right]!=nums[left],left向右移一步,并把right指向的值赋给left。
#include <stdio.h>
int removeDuplicates(int* nums, int numsSize){
if(nums==NULL||numsSize==0)
return 0;
else{
int left=0,right;
for(right=1;right<numsSize;right++)
{
if(nums[right]!=nums[left])
{
left++;
nums[left]=nums[right];
}
}
return ++left;
}
}
int main()
{
int n,i;
scanf("%d",&n);
int nums[n];
for(i=0;i<n;i++)
{
scanf("%d",&nums[i]);
}
printf("%d",removeDuplicates(nums,n));
return 0;
}
这时的时间复杂度为O(n),遍历一遍即可求出。
但此时要注意nums=NULL和numsSize=0的情况。