Third Maximum Number(leetcode)

Third Maximum Number--找出数组中第三大的值


  
这是一道Leetcode的一道题(难度标记为easy)给定一个非空的数组,但是觉得这个题还是很有意思的,就将这个题记录一下,供大家参考。

题目描述

  首先上题目:

Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n).

  上面题目的大致意思为:给定一个非空的整数数组,找出整个数组的第三大的整数,如果不存在,那么返回整个数组中的最大的那个数。整个算法的时间复杂度必须在O(n)。

解题思路

  整个算法的时间复杂度必须在控制在O(n)区间内,这就保证了我们的算法从原则上只需要遍历数组一遍。这里我采用的思路就是:利用3个变量来记录数字中的第一大,第二大,第三大的变量,并且另外3个变量来记录这3个数是否来存在,然后遍历数组中的每个元素,每遍历一个元素,根据大小来改变数组中对应的变量。

程序代码

  这里我为了方便,提供了Java的源代码,这里仅供大家参考:

class Solution {
    public int thirdMax(int[] nums) {
        int second = 0;  // 记录第二大的元素
        int third = 0;   // 记录第三大的元素
        boolean[] exists = {false, false, false}; // 初始化,最初默认3个数都不存在
        int first = nums[0]; // 由于数组非空,初始化第一大的元素
        exists[0] = true;  // 第一大的数已经存在,更改对应的布尔变量
        for (int i = 1; i < nums.length; i++) {
            if (nums[i] > first) { // 如果是当前最大的数
                third = second;  // 下面2行分别对当前的数进行移位,第二大变为第三大,第一大变为第二大
                second = first;
                first = nums[i]; // 更新最大的数
                exists[2] = exists[1]; // 同时更新对应的布尔变量
                exists[1] = exists[0];
                exists[0] = true;
            } else if (nums[i] == first) {  // 如果与最大的数相等 则进行下一次循环
                continue;
            } else {
                if (exists[1] == true) {  // 如果当前第二大的数存在
                    if (nums[i] > second) { // 如果当前值大于第二大的值 
                        third = second; // 和上面的代码类似 进行以为 同时更新对应的布尔变量
                        second = nums[i];
                        exists[2] = exists[1];
                        exists[1] = true;
                    } else if (nums[i] == second) {
                        continue;
                    } else {
                        if (exists[2] == true) { // 如果第三大的数存在 
                            if (nums[i] > third){ // 如果当前值比第三大的数要大 则更新第三大的数
                                third = nums[i];
                                exists[2] = true;
                            }
                        } else {  //如果第三大的数不存在 那么就直接赋值
                            exists[2] = true;
                            third = nums[i];
                        }
                    }
                } else { // 如果当前第二大的数不存在 则直接将当前值赋给第二大的值
                    exists[1] = true;
                    second = nums[i];
                }
            }
        }
        if (exists[2] == true) // 遍历结束, 如果第三大的数存在,则返回,如果不存在,则返回最大的
            return third;
        return first;
    }
}

  上面的代码满足了题目的要求,进行提交,可以看到代码的时间还是可以的。
执行效果

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值