题目描述
给你一个非空数组,返回此数组中第三大的数 。如果不存在,则返回数组中最大的数。
问题分析
注意要查找的数是数组中第三大的数,相同大小的数算一个,对于此问题可以采用先将数组排序然后查找第三大的数采用排序的方式最快为O(nlog2n)O(nlog_2n)O(nlog2n),也可以采用将前三大的数存储到一个数组中,然后按顺序遍历原数组找出前三大的数,这样时间复杂度为O(n)O(n)O(n)。
代码
int thirdMax(int* nums, int numsSize){
int x[3];
if(numsSize==2){
return nums[1]>=nums[0]?nums[1]:nums[0];
}else if(numsSize==1){
return nums[0];
}else{
int j = 0;
int xxxx=1;
for(int i=0; i<numsSize; i++){
if(j<3){
int flag = 1;
for(int k=0; k<j; k++){
if(nums[i]==x[k]){
flag = 0;
break;
}
}
if(flag){
x[j++] = nums[i];
}
}else{
if(xxxx){
for(int i=0; i<3; i++){
for(int j=i+1; j<3; j++){
if(x[i]<x[j]){
int t = x[i];
x[i] = x[j];
x[j] = t;
}
}
}
xxxx = 0;
}
int flag = 1;
for(int k=0; k<3; k++){
if(nums[i]==x[k]){
flag = 0;
break;
}
}
if(flag){
if(nums[i]>x[0]){
x[2] = x[1];
x[1] =x[0];
x[0] = nums[i];
}else if(nums[i]>x[1]&&nums[i]!=x[0]){
x[2] = x[1];
x[1] = nums[i];
}else if(nums[i]>x[2]&&nums[i]!=x[1]){
x[2] = nums[i];
}
}
}
}
if(j==2){
return x[1]>x[0]?x[1]:x[0];
}else if(j==1){
return x[0];
}
}
for(int i=0; i<3; i++){
for(int j=i+1; j<3; j++){
if(x[i]<x[j]){
int t = x[i];
x[i] = x[j];
x[j] = t;
}
}
}
return x[2];
}