leetcode笔记之[414. 第三大的数]

52 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情

一、题目描述:

414. 第三大的数 - 力扣(LeetCode)

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

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

二、思路分析:

求第三大的数,就可以想到创建三个变量a,b,c,分别用a存储所传数组中第一大的数,b存储第二大的数,c存储第三大的数。

  1. 将数组的第一个元素与a相比较,如果大于a,则把b的值赋给c,将a的值赋给b,数组第一个元素的值赋给a,进行下一次循环,反之跳过;
  2. 如若接下来有元素小于a,并且大于b,那就可以将b的值赋给c,此元素的值赋给b,然后进行下一次循环,反之跳过;
  3. 接下来如果有元素能够不进入上面两个if中并且大于a,那就可以将其直接赋给a。这样只需遍历一次就可得到我们想要的信息:如果a>b>c那就可以直接输出c了,其余直接输出a。

三、AC 代码:

int Min(int* nums,int numsSize )
{
    int min = INT_MAX;
    int i =0;
    for(i = 0; i < numsSize;i++)
    {
        if(nums[i] < min)
        {
            min = nums[i];
        }
    }
    return min;
}
int thirdMax(int* nums, int numsSize) {
    int a = Min(nums,numsSize );//得到数组中最小值
    int b = a;
    int c = a;
    int i = 0;
    for(i = 0; i < numsSize; i++)
    {
        if(nums[i] == a || nums[i]== b|| nums[i]==c)
            continue;
        else
        {
            if(nums[i] > a )
        {
            c=b;
            b =a;
            a =nums[i];
        }
        else if(nums[i] >b  )
        {
            c =b;
            b = nums[i];
        }
        else if(nums[i]>c)
        {
            c = nums[i];
        }
        }
    }
    if(a>b&&b>c)
        return c;
    else
        return a;
}