【题目】
给你一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。
【示例】
示例 1:
输入:[3, 2, 1]输出:1解释:第三大的数是 1 。
示例 2:
输入:[1, 2]输出:2解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1]输出:1解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
【解析】
1. 由题目可知该数组为非空数组,不存在返回空的情况;
2.本来我看见题目说第三大的数如果存在就输出,不存在就输出最大的值,以为应该先队数组的长度进行判断,分成数组长度小于3和其他类,后来发现不需要;不管数组多长,直接对数组进行排序去重,最后对结果容器数组进行长度判断就可以;
3.要查找数组中第三大的元素:首先应该对数组进行排序,直接使用Java自带的Arrays.sort()方法进行顺序排序;
4.由示例 3 可以看出同样大小的元素会进行跳过,不会用于排序,所以要对数组进行去重操作;
5.将去重之后的元素添加到一个新的数组中(此时新数组没有重复元素并且是顺序排序),然后对新数组判断是否小于 3 :如果小于 3 ,则输出最大值 , 否则输出第三大元素;
【代码】
class Solution {
public int thirdMax(int[] nums) {
//将数组进行升序排序
Arrays.sort(nums);
//创建一个新的数组用于存储去重后的数据
ArrayList<Integer> list = new ArrayList<>();
int num = 0;
//去重
for(int i=0; i<nums.length; i++){
//看是否遍历到了最后一个元素,防止索引越界
//不是最后一个元素,所以都与后一个元素比较,看是否相同
//如果遍历到了最后一个还与后一个元素进行比较就会造成索引越界
if(i < nums.length-1){
if(nums[i] != nums[i+1]){
list.add(nums[i]);
num++;
}
}
//遍历到了最后一个元素,之间将其添加到新数组中
//因为如果前一个元素与它相同,那么前一个元素不会添加到数组中,则将它添加;
//不相同也是添加
else{
list.add(nums[i]);
}
}
//判断新数组长度是否小于3
//大于等于3则输出第三大的数
if(list.size() >= 3){
return list.get(list.size() - 3);
}
//小于3则输出最大值
else{
return list.get(list.size()-1);
}
}
}
【复杂度分析】
时间复杂度:O(nlogn),其中 n 是数组 nums 的长度。这是因为代码中使用了 Arrays.sort() 方法对数组进行排序,其时间复杂度为 O(nlogn)。其他操作的时间复杂度都小于或等于 O(n),因此总的时间复杂度为 O(nlogn)。
空间复杂度:O(n),其中 n 是数组 nums 的长度。这是因为代码中创建了一个新的 ArrayList 用于存储去重后的数据,其空间复杂度为 O(n)。其他变量的空间复杂度都小于或等于 O(1),因此总的空间复杂度为 O(n)。