数据结构入门练习第一题:判断是否有重复元素

判断是否有重复元素

力扣217题

第一种方法:排序后判断

对数组里面的数组进行从小到大的排序,如果出现前一个元素没有大于后面的元素,则说明,有重复元素。

排序方法选择:快速排序

快速排序思路(分治的思想)

在待排序的数组的中,选择一个数字作为基准数。然后对数组里面的数字进行比较,如果发现比这个数字大,则把大的数字放在基准数的后面;如果发现有数字比基准数小,则把小的数字放在基准数的前面。第一个基准数分成了两个区,然后再从分区里面寻找一个基准数,重复上面的操作,知道每个分区只有的一个基准数为止。
具体的看代码:

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值