一、题目描述
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
示例 1:
1 | 输入: [1,2,3,1] |
示例 2:
1 | 输入: [1,2,3,4] |
示例 3:
1 | 输入: [1,1,1,3,3,4,3,2,4,2] |
二、题解
1. 算法描述
- 暴力法:两个for循环嵌套遍历
- 使用qsort()排序,再逐位检查
2. 个人分析
- 暴力法超时
- qsort()最坏复杂度:O(nlogn)
3. 代码
1 | int compare(const void *a, const void *b) |
三、PS:
暴力法超时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17bool containsDuplicate(int *nums, int numsSize)
{
if (numsSize == 1)
return false;
int i, j;
for (i = 0; i < numsSize; i++)
{
for (j = i + 1; j < numsSize; j++)
{
if (nums[i] == nums[j])
{
return true;
}
}
}
return false;
}qsort()快速排序:
void qsort(void *_Base, size_t _NumOfElements, size_t _SizeOfElements, int (*_PtFuncCompare)(const void *, const void *))
- _Base:待排序的数组
- _NumOfElements:数组中元素的个数
- _SizeOfElements:数组中元素的大小
- (_PtFuncCompare)(const void , const void *)):比较指针
qsort()函数实例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20int compare1(const void *a, const void *b)
{ //升序
return (*(int *)a - *(int *)b);
}
int compare2(const void *a, const void *b)
{ //降序
return (*(int *)b - *(int *)a);
}
int main()
{
int array[] = {4, 5, 3, 6, 2, 5, 1};
int numsOfArray = sizeof(array) / sizeof(array[0]);
int sizeOfElem = sizeof(array[0]);
qsort(array, numsOfArray, sizeOfElem, compare1);
int i;
for (i = 0; i < numsOfArray; i++)
{
printf("%d", array[i]);
}
}