給定一個整數數組,判斷是否存在重複元素。
如果任何值在數組中出現至少兩次,函數返回 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;
}