判断是否有重复元素
第一种方法:排序后判断
对数组里面的数组进行从小到大的排序,如果出现前一个元素没有大于后面的元素,则说明,有重复元素。
排序方法选择:快速排序
快速排序思路(分治的思想)
在待排序的数组的中,选择一个数字作为基准数。然后对数组里面的数字进行比较,如果发现比这个数字大,则把大的数字放在基准数的后面;如果发现有数字比基准数小,则把小的数字放在基准数的前面。第一个基准数分成了两个区,然后再从分区里面寻找一个基准数,重复上面的操作,知道每个分区只有的一个基准数为止。
具体的看代码:
void quicksort(int num[], int low, int high){
int i =low, j = high;
while(i < j){
int med = num[low]; //取一个值,用来中间缓存
while(i < j && nums[j] > temp){ //从高位判断,一个一个查找,直到找到一个数字小于med
j--;
}
if(i < j){//找到后,用交换i,j的值,nums[i]值存在med中,不会丢失
nums[i] = nums[j];
i++;
}
while(i < j && nums[i] < temp){//从低位判断,直到找到数字比med大
i++;
}
if(i < j){//找到后,直接交换两个数字的位置,因为nums[j]值已经在上面赋给了nums[i],可以看成是空值
nums[j] = nums[i];
j--;
}
}
//第一轮判断完成,将中间nums[i]空值赋为med
nums[i] = med;
quickSort(nums,i+1,high);
quickSort(nums,low,i-1);
}
重复方法判断:后一个元素需大于前一个,否则有重复
if(nums[i + 1] <= nums[i]) return true;
else return false;
第二种方法:hash表,逐个插入,判断是否有重复
这种方法理解起来很简单,主要是hash封装库的实现问题,还有一些hash封装函数的使用,理解了即可。
struct hashrepeat{
int id;
UT_hash_handle hh;
};
//方法二:哈希表逐步插入该值,判断是否存在,如果是,则return false,直至所有元素判断完成
bool containsDuplicate(int* nums, int numsSize){
struct hashrepeat *s = NULL;
for(int i = 0; i < numsSize; i++){
struct hashrepeat *tmp = NULL;
HASH_FIND_INT(s,nums+i,tmp);
//hash_find_int:函数的三个参数意义:
//第一个参数:hash表,第二个参数:传递值的地址,第三个参数:最后s是输出变量。
//当可以在哈希表中找到相应键值时,tmp返回给定键的结构,当找不到时s返回NULL。
if(tmp == NULL){
//需要申请新的地址赋给申请的hash表
tmp = (struct hashrepeat *)malloc(sizeof(struct hashrepeat));
tmp -> id = nums[i];
HASH_ADD_INT(s,id,tmp);
//第一个参数是hash表,第二个参数是,要增加的值的名称,第三个是要添加的指针
}
else{
return true;
}
}
return false;
}