给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
该题来自力扣题库
示例
示例 1:
输入: [3, 2, 1]
输出: 1
第三大的数是 1
示例 2:
输入: [1, 2]
输出: 2
第三大的数不存在, 所以返回最大的数 2
示例 3:
输入: [2, 2, 3, 1]
输出: 1
注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。
思路
1.如果数组的长度是1的话,那么直接返回这个数字
2.如果数组的长度是2的话,那么返回的是两个数比较大的那个数
3.如果长度大于等于3的话,先把这个数组从小到大排列,直接调用Array.sort()这个方法,我们就得到了有序数组。
之后从后往前分别找到max1(第一大),max2(第二大),max3(第三大)的数字。
如果max3不存在那就返回max1,如果max3存在那就返回max3。
值得注意的一点是,我设置了一个布尔型变量,初始值是flase,这个布尔型变量的作用就是看max3是否存在,如果max3存在的话,就会变成true。
代码详情如下:
代码
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);
boolean f=false;//判断max3的时候用到的
int len=nums.length-1;
int max1=nums[len];
int max2=0;
int max3=0;
int i=0;
for(i=len-1;i>=0;i--){
if(nums[i]==max1){
continue;
}else{
max2=nums[i];
break;
}
}
for(int j=i-1;j>=0;j--){
if(nums[j]==nums[i]){
continue;
}else{
f=true;
max3=nums[j];
break;
}
}
if(f){
return max3;
}else{
return max1;
}
}
}
总结
这个sort方法很好用。sort()是Java中用来排序的一个方法,并且时间复杂度和空间复杂度相对都不会过高。
数字类型,从小到大排序(浮点型也一样)
int[] arr={'2','6','4','1'};
Arrays.sort(arr);
//这样arr会成为一个从小到大的顺序数组
//arr会是{'1','2','4','6'}