leetcode简单题 414. Third Maximum Number

题目描述:
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,大致结束了~

猜你喜欢

转载自blog.csdn.net/zimengxueying/article/details/86756128