给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 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;
}