给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
示例:
-
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.
-
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2
-
输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。 存在两个值为2的数,它们都排第二。
思路:
因为数组是非空的,所以暂时分为3种情况
- 数组中只有1个元素,那就直接返回
- 数组中有两个元素,返回2个中比较大的那个数
- 数组有3及以上的元素
针对第三种情况呢,我是直接定义三个变量来直接记录第一大、第二大、第三大的值。
然后循环数组
通过条件判断来记录这三个值,最后做相应的返回。
class Solution {
public int thirdMax(int[] nums) {
if(nums.length == 1)
return nums[0];
if(nums.length == 2)
return Math.max(nums[0],nums[1]);
long firstMax = Long.MIN_VALUE;
long secondMax = Long.MIN_VALUE;
long thirdMax = Long.MIN_VALUE;
for(int i = 0;i<nums.length;i++){
if(nums[i]>firstMax){
thirdMax = secondMax;
secondMax = firstMax;
firstMax = nums[i];
}else if(nums[i]<firstMax&&nums[i]>secondMax){
thirdMax = secondMax;
secondMax = nums[i];
}else if(nums[i]<secondMax&&nums[i]>thirdMax){
thirdMax = nums[i];
}
}
return thirdMax!=Long.MIN_VALUE?new Long(thirdMax).intValue():new Long(firstMax).intValue() ;
}
}