Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。
示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
提示:
- 1 <= nums.length <= 10^4
- -2^31 <= nums[i] <= 2^31 - 1
二、思路分析:
之前想的是单独判断数组中元素的个数是否大于3。但看了许多大佬的解题思想后,知道了可以在最后通过三个(第一大、第二大、第三大)数是否重复来判断。如果元素个数小于3,则肯定会有重复值,即应该返回数组中最大的数。 要注意对数组进行循环判断其大小时,要添加不等于的条件。如当前数可能等于第二大数,因此它满足if-else的第三个条件,若不对它进行条件判断,则会出现前三大数中有重复的现象。
三、AC 代码:
int thirdMax(int* nums, int numsSize){
int i, min=nums[0];
int first, second, third;
for(i=0 ; i < numsSize; i++){ //找到数组中最小值
if(min > nums[i])
min = nums[i];
}
first=second=third=min;
for(i=0 ; i < numsSize; i++){
if(nums[i] > first){ //当前数 > 最大数
third = second;
second = first;
first = nums[i];
}
else if(nums[i] > second && nums[i] != first){ //当前数不等于最大数, 且大于第二大数
third = second;
second = nums[i];
}
else if(nums[i] > third && nums[i] != second && nums[i] != first){ //当前数不等于前面两数, 且大于第三大数
third = nums[i];
}
}
if(first == second || second == third) //判断各值是否唯一
return first;
else
return third;
}