前言
这本来是6号的题,但是由于昨天的我并没有想出符合题意得解法,就没写博客,就留到了今天来写博客,但是今天的我,貌似计算的时间复杂度和空间复杂度都还不如我昨天不符合题意得解法。但是我起码也想到了,嘿嘿。
打卡界面
原题题目
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
题目案例
题目分析
看到这道题得时候,我的脑海中只有一种声音在我脑海中徘徊——排序,只要从大到小排序搞定,取哪一个数不还是简简单单得,所以我昨天就用了排序来做这道题,一起看看叭!
代码展示
public int thirdMax(int[] nums) {
Arrays.sort(nums);
reverse(nums);
for (int i = 1, diff = 1; i < nums.length; ++i) {
if (nums[i] != nums[i - 1] && ++diff == 3) { // 此时 nums[i] 就是第三大的数
return nums[i];
}
}
return nums[0];
}
public void reverse(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}
方法一:leetCode运行结果截图
但是我计算了一下,他的时间复杂度并不符合题目要求得O(n),它得时间复杂度为O(nlogn),所以我就尝试了一下,利用hash查重,但是hash查重完之后,我们还是需要进行排序鸭,于是我就想到了它的子类,TreeSet,这就可以了。代码查看
public int thirdMax(int[] nums) {
Set<Integer> s1 = new TreeSet<Integer>();
for (int i : nums) {
s1.add (i);
}
System.out.println();
if(s1.size() == 1){
return nums[0];
}
else if(s1.size()== 2){
int i1=0,i2=0;
int x= 0;
for(int i : s1){
if(x==0){
i1 = i;
x++;
}
else {
i2 = i;
}
}
return Math.max(i1,i2);
}
else {
int i = 0;
for (int x : s1) {
i++;
if ( i == s1.size()-2 ) {
return x;
}
}
}
return 0;
}
方法二:leetCode运行结果截图
Ps:每日一句毒鸡汤:做题前,先想想出题者的用意,我觉得他想我死。