【初级算法】LC——4.存在重复元素(最细的排序讲解!!!)

本想更新一个哈希解法的,但是苦于还没看懂。所以就留个坑,后期回来填。

本期知识点:qsort() 排序函数

什么是qsort() 函数?

qsort 函数是C语言编译器函数库自带的排序函数

qsort() 函数有什么?

函数原型:
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))

  • base – 指向要排序的数组的第一个元素的指针;
  • nitems – base 指向的数组中元素的个数;
  • size – 数组中每个元素的大小,以字节为单位;
  • compar – 用来比较两个元素的函数,即函数指针(回调函数)

回调函数:
一个通过函数指针调用的函数,如果把这个函数的指针(函数地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,就被称为回调函数。

简单来说,一间房子(函数)里面放着一把房间钥匙(函数指针),当我拿这把钥匙去开那个房间的时候,这个房间就被叫做回调房间(回调函数)

compar 参数:
compar 参数指向一个对比两个元素的函数。

  • 注意两个形参必须是const void * 型;
  • 同时传入的实参也必须转换成const void * 型;
  • 在compar 函数内部会将const void * 型转换成实际类型。

compar原型:
int compar(const void *p1, const void *p2);

  • 如果compar返回值小于0(< 0),那么p1所指向元素会被排在p2所指向元素的左面;
  • 如果compar返回值等于0(= 0),那么p1所指向元素与p2所指向元素的顺序不确定;
  • 如果compar返回值大于0(> 0),那么p1所指向元素会被排在p2所指向元素的右面。

说明
qsort() 函数不返回任何值


题目要求

给定一个整数数组,判断是否存在重复元素。

如果存在一值在数组中出现至少两次,函数返回 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. 通过排序,将数组内的所有元素变成有序数组;
  2. 而后我们不断对比前后两个元素;
  3. 当出现相同元素时,就判断为存在重复元素;
  4. 若循环完整个数组都没有退出时,判断为不存在重复元素。

排序法

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;	// 否则返回无
}

以上就是本篇文章的全部内容了,如果觉得有帮助到你的,

麻烦点赞转发收藏!!!

我们下期再见!


在更新技术文章的同时,我还会更新我的学习方法到知乎上,如果大家感兴趣的可以去看一下。

【初级算法】LC——4.存在重复元素(最细的排序讲解!!!)_第1张图片

你可能感兴趣的:(算法题解,指针,leetcode,数据结构,算法,排序算法)