414. 第三大的数 [春招刷题]

142 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

414. 第三大的数

给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。

示例 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;
}