力扣【414-第三大数】【数组-C语言】

题目:力扣-414

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

(注:数组类型为int,-231 < int < 231 - 1)

解题方法

方法一:

暴力破解,先排序,然后再找第三大数(略,时间复杂度:O(nlogn))

方法二:

创建一个大小为3的有序集合,遍历数组时,没遍历一个元素,就将其插入有序集合,若有序集合的大小超过 3,就删除集合中的最小元素。这样可以保证有序集合的大小至多为 3,且遍历结束后,若有序集合的大小为 3,其最小值就是数组中第三大的数;若有序集合的大小不足 3,那么就返回有序集合中的最大值。
(时间复杂度:O(n),其中 n 是数组 nums 的长度。由于有序集合的大小至多为 3,插入和删除的时间复杂度可以视作是 O(1) 的,因此时间复杂度为 O(n))

方法三:

可以遍历数组,并用三个变量 a、b 和 c 来维护数组中的最大值、次大值和第三大值,以模拟方法二中的插入和删除操作。首先初始化a、b、c为-263,若有nums[i]>a,则把b赋给c(即c=b),a赋给b(b=a),nums[i]赋给a(a=nums[i]),这就相当与往有序集合中插入元素,并删除最小元素(原来的c);若a<nums[i]<b,则把b赋给c,nums[i]赋给b,a不变;若b>nums[i]>c,则c=nums[i],a,b不变;若nums[i]<c,则不用处理,nums[i]比有序集合里的三个数都小,一定不是第三大数,不用插入集合。

#include <limits.h>
int thirdMax(int* nums, int numsSize) {
    long a, b, c; // a为最大数,b为次大数,c为最小数
    a = b = c = LONG_MIN;//初始化为long类型的最小值 LONG_MIN=-2^63
    for (int i = 0; i < numsSize; i++) {
        if (nums[i] > a) {
            c = b;
            b = a;
            a = nums[i];
        } else if (nums[i] < a && nums[i] > b) {
            c = b;
            b = nums[i];
        } else if (nums[i] < b && nums[i] > c) {
            c = nums[i];
        }
    }
    return c == LONG_MIN ? a : c;
}

时间复杂度:O(n)
空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值