414、给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
思路已经注释比较清楚啦,还有不理解的,或者更好的可以评论。
public int thirdMax(int[] nums) {
Arrays.sort(nums);
int thirdMax = Integer.MAX_VALUE;
int i = nums.length-1;//从数组最后一位开始比较,并且最后一位一定第一大
int count = 0;
if (nums.length<3) {//数组元素数目小于3一定没有第三大,返回最大
return nums[nums.length-1];
}
while (i>=0) {
if (nums[i] < thirdMax) {//当小于前一个数,那么 这个数 是第几大级别也会降一
thirdMax = nums[i];//把级别降低的暂存到thirdMax
count++;//同时记录此数第几大
}
i--;
if (count==3) {//当得到第三大时返回
return thirdMax;
}
}
if (count<3) {//当把所有数组元素比较完以后依然没有第三大的元素只能讲最大的返回
return nums[nums.length-1];
}
return thirdMax;
}