217. 存在重复元素
这道题肯定不能单纯的写个时间复杂度是n*n的双循环代码,这样会超过时间,而且很低级
方法一:排序思想,即先进行排序,再进行查找,左右两个都不一样那就全都不一样了。
里面应用了qsort()函数
qsort()函数:快速排序的函数 -引用stdlib.h头文件
参数说明:
void qsort (
void* base, //要排序的目标数组
size_t num, //待排序的元素个数
size_t width, //一个元素的大小,单位是字节
int(*cmp)(const void* e1, const void* e2)
);
其中cmp是函数指针,cmp指向的是:排序时,用来比较两个元素的函数。
需要自己编写。
具体的qsort操作链接: click
解法1
int cmp(const void* _a, const void* _b) {
int a = *(int*)_a, b = *(int*)_b;
return a - b;
}
bool containsDuplicate(int* nums, int numsSize) {
qsort(nums, numsSize, sizeof(int), cmp);
for (int i = 0; i < numsSize - 1; i++) {
if (nums[i] == nums[i + 1]) {
return true;
}
}
return false;
}
时间复杂度:O(NlogN),其中 N为数组的长度。需要对数组进行排序。
空间复杂度:O(logN),其中 N为数组的长度。注意我们在这里应当考虑递归调用栈的深度。
方法二:哈希表
struct hashTable {
int key;
UT_hash_handle hh;
};
bool containsDuplicate(int* nums, int numsSize) {
struct hashTable* set = NULL;
for (int i = 0; i < numsSize; i++) {
struct hashTable* tmp;
HASH_FIND_INT(set, nums + i, tmp);
if (tmp == NULL) {
tmp = malloc(sizeof(struct hashTable));
tmp->key = nums[i];
HASH_ADD_INT(set, key, tmp);
} else {
return true;
}
}
return false;
}