难度简单424收藏分享切换为英文接收动态反馈
给定一个整数数组,判断是否存在重复元素。
如果存在一值在数组中出现至少两次,函数返回 true
。如果数组中每个元素都不相同,则返回 false
。
示例 1:
输入: [1,2,3,1]
输出: true
示例 2:
输入: [1,2,3,4]
输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2]
输出: true
---------------------------------分割线------------------------------------
方法1.暴力双重遍历,失败,耗时过长,最后一组用例不过 时间复杂度 O(n^2)
bool containsDuplicate(int* nums, int numsSize){
int i,j;
//1.暴力双重遍历,最后一个耗时太长
for(i=0;i<numsSize-1;i++){
for(j=i+1;j<numsSize;j++){
if(nums[i]==nums[j])
return true;
}
}
return false;
}
方法2.桶统计 O(n),空间换时间,题目没给出数组元素取值范围,不可用!
方法3.Hash集 O(n),空间换时间
typedef struct{
int key;
UT_hash_handle hh;
}HASH_TABLE;
HASH_TABLE *my_set = NULL;
HASH_TABLE *my_find(int ikey){
HASH_TABLE *tmp=NULL;
HASH_FIND_INT(my_set, &ikey, tmp);
return tmp;
}
void my_add(int ikey){
HASH_TABLE *get = my_find(ikey);
if(get==NULL){
HASH_TABLE *new = malloc(sizeof(HASH_TABLE));
new->key = ikey;
HASH_ADD_INT(my_set, key, new);
}
}
bool containsDuplicate(int* nums, int numsSize){
int i;
my_set = NULL;
for(i=0;i<numsSize;i++){
if(my_find(nums[i])==NULL){
my_add(nums[i]);
} else {
return true;
}
}
return false;
}
官方C语言hash表解法
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;
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/contains-duplicate/solution/cun-zai-zhong-fu-yuan-su-by-leetcode-sol-iedd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。