【题目描述】
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
【示例1】
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.
【示例2】
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 .
【示例3】
输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。
【注意】
1、时间复杂度必须为O(n)
【思路】
1、三指针
2、初始化三个变量 分别为第一大max 第二大maxSec 第三大maxThird ,注意界限问题
3、遍历数组 一个数字有三种情况
- 大于max
- 小于max 大于maxSec
- 小于maxSec 且大于maxThird
4、返回maxThird
5、时间复杂度O(n)
6、空间复杂度O(1)
Swift代码实现:
func thirdMax(_ nums: [Int]) -> Int {//[2, 2, 3, 1]
if nums.count == 1 { return nums[0] }
if nums.count == 2 {
return max(nums[0], nums[1])
}
var max = Int.min
var maxSec = Int.min
var maxTir = Int.min
for num in nums {
if num > max {
maxTir = maxSec
maxSec = max
max = num
}
if num < max && num > maxSec {
maxTir = maxSec
maxSec = num
}
if num < maxSec && num > maxTir {
maxTir = num
}
}
if maxTir == Int.min {
return max
}
return maxTir
}