原题:力扣414 难度:easy
题目:
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。
示例 2:
输入:[1, 2] 输出:2 解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1] 输出:1 解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。 此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
分析:看一下这道题题目不是很难,第一个注意点是返回第三大的数,重复的数字不能重复算上,这一点在实例3中很明显,首先想到的就是可以对数组进行排序,然后加一些限定条件来找到第三大的数是哪个。可以用C语言的库函数qsort(),函数需要传递的参数是数组名,数组元素个数,元素的字节大小和比较函数,这个比较函数其实在这道题有点坑,那么正常来看代码就是这样
int Cmp(void* p1,void* p2){
return *(int*)p2 - *(int*)p1;
}
int thirdMax(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(nums[0]),Cmp);
int count = 1;
for(int i = 0;i < numsSize - 1;i++){
if(nums[i+1] != nums[i]){
count++;
}
if(count == 3){
return nums[i+1];
}
}
return nums[0];
}
但是运行后发现报错,
Line 2: Char 22: runtime error: signed integer overflow: 1 - -2147483648 cannot be represented in type 'int' [solution.c]
最后执行的输入
[-2147483648,1,1]
这里不难发现,如果其中一个数在int的范围的边界的话,在减去一个大于0的数必会超出int的范围,这里可以换个思路,反正就是比较大小罢了,直接换成大于号效果也一样,于是正确的代码就是:
int Cmp(void* p1,void* p2){
return *(int*)p2 > *(int*)p1;
}
int thirdMax(int* nums, int numsSize){
qsort(nums,numsSize,sizeof(nums[0]),Cmp);
int count = 1;
for(int i = 0;i < numsSize - 1;i++){
if(nums[i+1] != nums[i]){
count++;
}
if(count == 3){
return nums[i+1];
}
}
return nums[0];
}