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


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章