力扣-第414题--第三大的数(python)--逐步解析

给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1]
输出:1
解释:第三大的数是 1 。

示例 2:
输入:[1, 2]
输出:2
解释:第三大的数不存在, 所以返回最大的数 2 。

示例 3:
输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。


  • 注意:
    这里的第几大,是绝对大, e.g. 1,2,2,
    第三大为 1, 而非 2。
    这里注意边界, 元素的个数时可能小于 3 个的。
    ----一个元素,返回自身
    ----二元素,取最大值即可

代码逐步分析:
1、首先执行第一个if语句,当前元素大于 first, 更新 first, second, third。continue后返回for循环,遍历第二个元素。

if cur > first:
    third = second
    second = first
    first = cur
    continue  # 执行第一个if后,再执行continue,意思是返回循环,遍历第2个值

2、当前值cur不符合第一个if语句,就执行第二个if语句;当前元素大于 second, 更新 third, second 指针;continue后返回for循环,遍历第三个元素。

# # 当前元素大于 second, 更新 third, second 指针
if cur > second:
    third = second
    second = cur
    continue

3、当前值cur不符合第一个、第二个if语句,就执行第三个if语句;当前元素大于 third, 更新 third 指针。
**说明:**这里只需要找到第三大的数,所以不需要往下遍历了。

# # 大于 third 时,更新 third 指针
if cur > third:
    third = cur

代码:

class Solution:
    def thirdMax(self, nums):

        l = len(nums)

        # # 长度小于等于 2 时,取最大值即可
        if l <= 2:
            return max(nums[0], nums[l - 1])

        first = second = third = float('-inf')

        for cur in nums:
            print('cur:', cur)
            print('first:', first)
            print('second:', second)
            print('third:', third)

            # # 由于第几大都是不能重复的,也就是说当前元素 cur 如果等于 first, second 时,忽略即可
            if cur == first or cur == second:
                # # 忽略当前元素
                continue

            # # 当前元素大于 first, 更新 first, second, third
            if cur > first:
                third = second
                second = first
                first = cur
                continue  # 执行第一个if后,再执行continue,意思时返回循环,遍历第二个值

            # # 当前元素大于 second, 更新 third, second 指针
            if cur > second:
                third = second
                second = cur
                continue

            # # 大于 third 时,更新 third 指针
            if cur > third:
                third = cur

        if third == float('-inf'):
            return first
        else:
            return third


if __name__ == '__main__':
    s = Solution()
    result_list = s.thirdMax([3, 0, 1])
    print('result_list:', result_list)

输出为:

cur: 3
first: -inf
second: -inf
third: -inf

# 第一轮:

cur: 0
first: 3
second: -inf
third: -inf

cur: 1
first: 3
second: 0
third: -inf

result_list: 0

复杂度分析:
----时间复杂度: O(N)
----空间复杂度:O(1)

你可能感兴趣的:(力扣-排序-python,leetcode,python,算法,排序)