存在重复元素算法(leetcode第217题)

题目描述:

给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。

示例 1:

输入:nums = [1,2,3,1]
输出:true

示例 2:

输入:nums = [1,2,3,4]
输出:false

示例 3:

输入:nums = [1,1,1,3,3,4,3,2,4,2]
输出:true

提示:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109

算法一:排序法

思路:

将所有元素进行排序,对相邻元素比较是否相同,找出重复元素

代码实现:
# include

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

算法二:hash表

思路:

创建hash表,利用取余来降低数据大小,具体实现见注释

代码实现:
bool containsDuplicate(int* nums, int numsSize){
    if(numsSize<2)//边界情况判断
        return false;
    
    int Hasharr[numsSize];
    int count = 0;
    int reminder = 0;

    //初始化
    for(int i=0;i防止与可被整除的数混淆
        if(nums[i] == 0){
            count++;
            if(count == 2)
                return true;
            continue;
        }

        // 4 100 1000 -50 1000
        reminder = nums[i]%numsSize;
        if(reminder<0)
            reminder+=numsSize;
        while(true){
            if(Hasharr[reminder]==0){//未存放-->存入新数据-->下一轮
                Hasharr[reminder] = nums[i];
                break;
            }
            //比对数据
            else if(Hasharr[reminder] == nums[i]){
                return true;
            }
            //不同-->移位-->重复判断是否一存放
            else{
                reminder++;
                if(reminder>=numsSize)
                    reminder-=numsSize;
            }
            
        }
    }
    return false;
}

你可能感兴趣的:(算法,leetcode,算法)