Leetcode刷题【数组】 求第二/三大的数

快手笔试原题:

给一个list ,只遍历一次,从中找出第二大的数

解决方法1: 先排序,再取值

先用sort ,自动升序排列,

nums = [2458]
nums_list = sorted(nums)
print('第二大的数是:',nums_list [-2])

知识点1:
sort方法时间复杂度:O(n log n)

python的 sort 内部实现机制为:Timesort,
Timsort是结合了合并排序(merge sort)和插入排序(insertion sort)而得出的排序算法
最坏时间复杂度为:O(n log n)
空间复杂度为:O(n)

解决方法2: 先初始化两个数,界定大小,取剩余的值和这两个 first和second比对,交换

注意:
初始的first和second先随意取两个数,先比较大小后,剩下的数再和这两个比较久比较简单了。

class  SecondNum(object):
    def get_second(self,nums):
        first=nums[0]
        second=nums[len(nums)-1]
        if first < second:
            second,first=first,second
        if len(nums)<2:
            return  "数组长度小于2,请添加数据"
        else:
            for i in range(1,len(nums)-1):  # 遍历的数>第一大的值,肯定大于第二个数
                if nums[i]>=first:   # 如果下一个值大于first,则将  下一个值赋值给 first ,原来的first赋值给 second
                    first,second=nums[i],first
                elif nums[i]>=second:
                    second=nums[i]
                else:
                    pass
            return [first,second]

leetcode 414 第三大的数

题目要求:

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

示例 1:

输入: [3, 2, 1]

输出: 1

解释: 第三大的数是 1.
示例 2:

输入: [1, 2]

输出: 2

解释: 第三大的数不存在, 所以返回最大的数 2 .
示例 3:

输入: [2, 2, 3, 1]

输出: 1

解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。

注意:
这里有几个特殊情况需要处理:

  1. 长度为2时,需要输出两个值中最大的
  2. 长度为3时,有重复数据
    思路:
    和上面方法2一样,先找3个初始值,排好顺序
    然后再和下面的数一一比对
    时间复杂度:O(n)
    因为刚开始,只是对3个数排序,时间复杂度O(3)
    下面的for循环遍历一次是O(n)
 def get_three(self,nums):
        if len(nums) < 3:
            if len(nums) == 2:
                first = nums[0]
                second = nums[len(nums) - 1]
                if first < second:
                    first, second = second, first
            else:
                return 0
            return first

        else:
            # 先对初始的3个数约定好大小顺序
            first = nums[0]
            second = nums[len(nums) - 1]
            third = nums[len(nums) - 2]
            if third > second:  # 如果第3>第2个
                if first > third:  # 且第1>第3
                    second, third = third, second
                else:
                    if first > second:  # 第1 >第2 且 第1< 第3
                        first, second, third = third, first, second
                    else:  # 第1 <第2   第3最大
                        first, second, third = third, second, first
            else:
                # 如果第3 < 第 2  且  第1 <第2     此时 第2 最大
                if first < second:
                    if first > third:
                        first, second, third = second, first, third
                    else:
                        first, second, third = second, first, third
                else:
                    pass
            # 开始进行比较
            for i in range(1, len(nums) - 2):
                if nums[i]>=first:
                    first,second,third=nums[i],first,second
                else:
                    if nums[i]>second:
                        second,third=nums[i],second
                    else:
                        if nums[i]>third:
                            third=nums[i]
                        else:
                            pass
            return [first,second,third]

你可能感兴趣的:(leetcode-数组)