给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
示例 1:
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.
示例 2:
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 .
示例 3:
输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/third-maximum-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法一:排序
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]);
Arrays.sort(nums);
int count = 1;
for(int i = nums.length-1; i > 0; i--){
if(nums[i] != nums[i-1]) count++;
if(count == 3) return nums[i-1];
}
return nums[nums.length-1];
}
}
解法二:依次求最大,第二大,第三大数
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]);
int max = nums[0];
for(int i = 0; i < nums.length; i++) {
if(nums[i] > max) max = nums[i];
}
int max2 = 0;
int i = 0;
for(i = 0; i < nums.length; i++) {
if(nums[i] < max) {
max2 = nums[i];
break;
}
}
if(i == nums.length) return max;
for(i = 0; i < nums.length; i++) {
if(nums[i] > max2 && nums[i] < max) {
max2 = nums[i];
}
}
int max3 = 0;
for(i = 0; i < nums.length; i++) {
if(nums[i] < max2) {
max3 = nums[i];
break;
}
}
if(i == nums.length) return max;
for(i = 0; i < nums.length; i++) {
if(nums[i] > max3 && nums[i] < max2) {
max3 = nums[i];
}
}
if(max3 == max2) return max;
return max3;
}
}