414. 第三大的数
难度:简单
题目描述
本来这道题不难,但是测试用例好坑,面向测试用例编程了好久
解题思路
类似于大根堆的思想,维护一个长度为3的数组,数组里元素按照从大到小的顺序排序。初始是int型最小值,每添加一个元素,维护数组里的元素大小顺序。
要注意的细节(巨坑)有:
重复的元素不能计算,如果不足三个值要返回最大值。这里的三个值不是数组的长度,是不重复出现的数字,比如111112,就只能算1和2,应该返回2.
还有测试用例
[-2147483648,-2147483648,-2147483648,-2147483648,1,1,1]
[1,2,-2147483648]
解决办法一是初始值设置成long型的最小值
我是设置一个标记位和计数位,如果第一次出现最小值,就把标记位置成false,这样以后再出现最小值就会被忽略掉。
出现一个满足条件的数字,就count++,最后判断count是不是大于3,如果大于3就返回三个数里最小的,如果小于3就返回大的
/*
* 414. 第三大的数
* 2020/6/29
*/
public int thirdMax(int[] nums) {
int[] top = new int[3];
int n = nums.length;
boolean flag = true;
if(n == 1) {
return nums[0];
}
if(n == 2) {
return Math.max(nums[0], nums[1]);
}
for (int i = 0; i < top.length; i++) {
top[i] = Integer.MIN_VALUE;
}
sortTop(top);
int count = 0;
for (int i = 0; i < nums.length; i++) {
if(nums[i]==Integer.MIN_VALUE&&flag){
count++;
flag = false;
}
if(nums[i] != top[0] && nums[i] != top[1] && nums[i] > top[2]) {
top[2] = nums[i];
count++;
sortTop(top);
}
}
if(count >= 3)
return top[2];
else {
return top[0];
}
}
public void sortTop(int[] top) {
if(top[0] < top[1]) {
swap(top, 0, 1);
}
if(top[0] < top[2]) {
swap(top, 0, 2);
}
if(top[1] < top[2]) {
swap(top, 1, 2);
}
}
public void swap(int[] nums,int a,int b) {
//System.out.println("交换"+nums[a]+" "+nums[b]);
int temp = nums[a];
nums[a] = nums[b];
nums[b] = temp;
}