leet 217. 存在重复元素

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

如果任何值在数组中出现至少两次,函数返回 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
#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <time.h>
/**
注意点:
1、给定数据为无序,可以考虑先排序,然后便利时间复杂度 O(排序)+O(遍历)
2、或者直接遍历数组一个一个元素比较时间复杂度
3、此处未给定数值最大值,否则可以利用桶排序思想申请一个最大数值数组
*/


/**排序算法不唯一,此处采用最简单的冒泡,大的元素后移动
    亲测冒泡超时超出时间限制
    */
bool containsDuplicate_1(int* nums, int numsSize){

    int i,j,temp;
    bool same = false;
    for(i=0; i <numsSize -1;++i){
        //外层for循环控制遍历次数
        for(j = 0; j<numsSize-1 -i ; ++j){
            //内从元素负责遍历对比移动
            if(nums[j] > nums[j+1]){
                temp = nums[j] ;
                nums[j] = nums[j+1];
                nums[j+1] = temp;
            }else if(nums[j] == nums[j+1])
            {
                same = true;
                return same;
            }
        }
    }
    for(i = 0,j = 1;i < numsSize-1;i++,j++){
        if(nums[i] == nums[j]){
            same = true;
            return same;
        }
    }

    return same;

}
/**
直接比较超时
*/
bool containsDuplicate_2(int* nums, int numsSize){

    int i,j,temp,k;
    bool same = false;
   for(k = 0; k< numsSize-1;k++){
    for(i = k+1;i < numsSize ;++i){
        if(nums[k] == nums[i]){
            same = true;
            return same;
        }
    }
   }
    return same;
}

///想了解快排参考博文https://blog.csdn.net/zhourunan123/article/details/81048764
void qSort(int *arr, int lower, int higher){
    if(lower >= higher)
        return;
    int low = lower;
    int high = higher;
        /**
        恶心!!!最后一组测试用例
        */
          //在拟排序的数组中,随机选择元素,置于首位(作key)
    srand(time(0));
    int temp,r=rand()%(higher-lower);
    temp=arr[low];
    arr[low]=arr[low+r];
    arr[low+r]=temp; ///随机初始基准
    temp=arr[low];
    while(low < high){ //最低端小于最高端
    /**
      如果基准数选取为array[low],那么必须先从高位high查找到小于基准的数,然后再从低位low寻找大于基准的数,交换;

     如果基准数选取为array[high],那么必须先从低位low查找到大于基准的数,然后再从高位high寻找小于基准的数,交换;
    */
        while(low<high && temp < arr[high]){
            high--;  //最高位指针左移
        }
        //找到比基准小的数值
        if(low < high){
            arr[low] = arr[high]; ///初始arr[low]即为基准
            low++;
        }
        ///下一步低位右移
        while(low < high && arr[low] < temp){
            low++;
        }
        //找到比基准大的数值
        if(low < high){
            arr[high] = arr[low];
            high--;
        }
    }
    arr[low] = temp; ///基准归位
    if(lower <low)
        qSort(arr,lower,low-1);
    if(low < higher)
        qSort(arr,low+1,higher);
}
bool containsDuplicate(int* nums, int numsSize){
    ///考虑快速排序

    qSort(nums,0,numsSize-1);
    int i;
    bool same = false;
   for(i = 0;i < numsSize-1;i++){
        if(nums[i] == nums[i+1]){
            same = true;
            return same;
        }
    }
    return same;
}

/**
c++利用set特性
class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
    set<int> values;
    for(auto num:nums){
        values.insert(num);

    }
    return nums.size() != values.size();
    }
};

*/

int main(void)
{
    int arr[7]= {1,6,2,4,5,1,7}; //int i=k=0 error

    bool same = containsDuplicate(arr, 7);
    if(same){
        printf("true");
    }else{
    printf("false");
    }

    for(int j =0; j<7; ++j)
    {
        printf("%d\n",arr[j]);
    }

    return 0;
}


发布了46 篇原创文章 · 获赞 1 · 访问量 5739

猜你喜欢

转载自blog.csdn.net/Happy_Yu_Life/article/details/103803731