题目描述:
Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n).
Example 1:
Input: [3, 2, 1]
Output: 1
Explanation: The third maximum is 1.
Example 2:
Input: [1, 2]
Output: 2
Explanation: The third maximum does not exist, so the maximum (2) is returned instead.
Example 3:
Input: [2, 2, 3, 1]
Output: 1
Explanation: Note that the third maximum here means the third maximum distinct number.
Both numbers with value 2 are both considered as second maximum.
解法:
自己的解答,题目要求是o(n)级别的时间,于是一开始想的非常简单就是,直接运行三次找三个最大数即可。其中对于一些细节还没有细想,细节方便耽误了一点时间。
代码如下:
int thirdMax(int* nums, int numsSize) { //o(3n) 是不死有更好的解决方法
int max1=nums[0];
int min=nums[0];
int max2,max3;
int flag1=0,flag2=0,flag3=0;
for(int i=0;i<numsSize;i++){
if(max1<nums[i]){
max1=nums[i];
}
if(min>nums[i]){
min=nums[i];
}
}
max2=min;
max3=min;
for(int i=0;i<numsSize;i++){
if(nums[i]<max1){
if(max2<nums[i]){
max2=nums[i];
flag2=1;
}
}
}
for(int i=0;i<numsSize;i++){
if(nums[i]<max1&&nums[i]<max2){
if(max3<nums[i]){
max3=nums[i];
flag3=1;
}
}
}
if(min==max3) flag3=1;
if(numsSize<3||flag2==0||flag3==0){
return max1;
}
else return max3;
}
1 由于max2和max3的初值设的是min的值,这是由于题目中没有给出范围,于是找一个最小的数来替代,因此会产生一个问题就是其实max2和max3的值没有变过如21111这种情况,所以用flag来记录
2 而flag记录之后又有一个特殊的就是第三小的数刚好就是最小的数,但是上述代码每次求最小值的时候是严格的小于,为防止32111这种情况的出现,所以 if(min==max3) flag3=1;
就是为了防止这种情况的产生。
3 最后贴出完成情况:
ok,大致结束了~