题目描述可以点击下面两个链接查看
存在重复
只出现一次的数字
第一个题代码如下:
#include<stdio.h>
#include<stdlib.h>
bool containsDuplicate(int* nums, int numsSize)
{
if(numsSize<2)//如果数组长度小于2,一定没有重复元素
{
return false;
}
int i=0,j=0;
int comp(const void *a,const void *b)//比较函数
{
return *(int*)a-*(int*)b;
}
qsort(nums,numsSize,sizeof(int),comp);//从小到大排序
for(i=0;i<numsSize-1;i++)
{
if(nums[i]==nums[i+1])
{
return true;
}
}
return false;
}
第二个题代码如下
#include<stdio.h>
#include<string.h>
int singleNumber(int* nums, int numsSize)
{
int comp(const void *a,const void *b)//比较函数
{
return *(int*)a-*(int*)b;
}
qsort(nums,numsSize,sizeof(int),comp);//从小到大排序
int i;
for(i=0;i<numsSize-1;i+=2)//因为题目说除了一个只出现1次的元素其他元素均出现2次
{
if(nums[i]!=nums[i+1])
return nums[i];
}
return nums[numsSize-1];//如果前面元素不符合,返回最后一个元素
}
这两个题都用到了快速排序。如果用两个for
循环就会导致时间超限,我也是查找了下别人的思路才发现先排序然后再用一个for
循环比较就不会导致时间超限。
所以在数组的问题上,有些时候可以先排序,就能减少for
循环的使用,减少时间复杂度。
关于快速排序点击这里。