【刷题笔记】414. 第三大的数

69 阅读1分钟

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

一、题目描述:

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

进阶: 你能设计一个时间复杂度 O(n) 的解决方案吗?

二、思路分析:

总体来说这道题不是特别难,适合一开始的练手,一看到需要进行比大小的我们可以很快想到我们需要进行排序,为了减少时间复杂度我们肯定选择递减的排序,这样可以更快找到更大的数字。
之后我们需要考虑到三个问题

  • 数组数字之间有重复
  • 数组的长度一开始就不足够容纳第三个最大的数
  • 数组长度够,但是相同的数字太多,导致没有第三个大的数
  • 所以综合上述考虑,我们可以想到我们需要一个计数器,用于来判断是否到达第三个最大的数
  • 首先当数组前后数字一样的时候,我们可以不更新我们的count而是直接跳过
  • 当我们遍历到最后一个数字的时候,此时我们的计数器还没有到2,说明没有第三个最大的数,所以我们可以直接返回第一个数,也就是题目所说的最大的数字
  • 最终这道题目就可以迎刃而解了。

三、AC 代码:

class Solution:
    def thirdMax(self, nums: List[int]) -> int:
        nums = sorted(nums,reverse=True)#先给序列排序,成为又大到小的排序
        length = len(nums)#找出长度
        count = 0#这里用于计数,当且仅当他数到2的时候才能确定是第三大的数字,用于减少排除重复的数字的状况
        idx = 0#这是用于遍历序列
        while count<2:#如果count==2,代表的是他已经到了第三个最大的数字
            if idx == length-1 and count != 3:#如果当这个数组的长度不是三或者没有第三大的数字的时候我们就应该返回最大的数,就是第一个数字
                return nums[0]
            elif idx < length-1 and nums[idx+1] == nums[idx]:#当我们前后的数一样的时候,我们应该选择不更新count而是更新idx
                idx += 1
            elif idx < length-1 and nums[idx+1] != nums[idx]:#不一样的时候我们同时更新
                idx += 1
                count += 1
        return nums[idx]