217、存在重复元素

题目

【学习计划 - 数据结构 - 第一天 - 数组】https://leetcode-cn.com/study-plan/data-structures/

https://leetcode-cn.com/problems/contains-duplicate/

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

如果存在一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false

程序样例

1
2
3
bool containsDuplicate(int* nums, int numsSize){

}

方法一

关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

bool containsDuplicate(int* nums, int numsSize){
bool flag = false;
int temp;
for(int i=0;i<numsSize;i++){
if(flag == true){
break;
}
for(int 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;
}
if(*(nums+j)==*(nums+j+1)){
flag = true;
break;
}
}
}
return flag;
}

思路:用冒泡排序排序,同时看有没有重复元素。

时间复杂度:$O(n^2)$

结果:超时

方法二

关键代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
bool containsDuplicate(int* nums, int numsSize){
int min=0,max=0,temp;


for(int i=0;i<numsSize;i++){
temp = *(nums+i);
if(temp<min){
min = temp;
}
if(temp>max){
max = temp;
}
}

int num0[max-min+1];

for(int i=0;i<max-min+1;i++){
num0[i] =0;
}

for(int i=0;i<numsSize;i++){
temp = *(nums+i);
if(*(num0+temp-min)==1){
return true;
}
*(num0+temp-min)=1;
}
return false;
}

思路:桶排序。由于数组下标从0开始,而需要比较的数字中可以有负数,所以找到最小值,桶排序时的下标为数值-最小值

:leetcode竟然没有把数组全部默认初始化为0,可能是初始化为随机数了。所以需要我再手动对桶数组初始化为0。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <stdio.h>

bool containsDuplicate(int* nums, int numsSize){
int min=0,max=0,temp;


for(int i=0;i<numsSize;i++){
temp = *(nums+i);
if(temp<min){
min = temp;
}
if(temp>max){
max = temp;
}
}

int num0[max-min+1];

for(int i=0;i<max-min+1;i++){
num0[i] =0;
}

for(int i=0;i<numsSize;i++){
temp = *(nums+i);
if(*(num0+temp-min)==1){
return true;
}
*(num0+temp-min)=1;
}
return false;
}
main(){
int numsSize=5;
int nums[]={1,5,-2,-4,0};

for(int i=0;i<numsSize;i++){
printf("%d\n",*(nums+i));
}

bool flag = containsDuplicate(nums,numsSize);
printf("--%d--\n",flag);
for(int i=0;i<numsSize;i++){
printf("%d\n",*(nums+i));
}
}

复杂度分析

执行用时:20 ms, 在所有 C 提交中击败了73.56%的用户

内存消耗:11.2 MB, 在所有 C 提交中击败了26.56%的用户