给一个list ,只遍历一次,从中找出第二大的数
先用sort ,自动升序排列,
nums = [2,4,5,8]
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)
注意:
初始的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]
题目要求:
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
示例 1:
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.
示例 2:
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 .
示例 3:
输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。
注意:
这里有几个特殊情况需要处理:
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]