20.4.11 第三大的数 简单

时间复杂度O(n),空间复杂度O(1)

题目

给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

示例 1:
输入: [3, 2, 1]
输出: 1
解释: 第三大的数是 1.

示例 2:
输入: [1, 2]
输出: 2
解释: 第三大的数不存在, 所以返回最大的数 2 .

示例 3:
输入: [2, 2, 3, 1]
输出: 1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。

解题思路

  1. 循环遍历全部数字,不断记录更新前三大的数字;

代码思路

  1. 这次的代码太繁琐了,还用了两个flag,虽然能运行成功,但是情况考虑分得很细碎,做个记录,以后再改进

代码

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        vector<int> record(4);
        record[1] = nums[0];
        int flag2 = 0;
        int flag3 = 0;
        for(int i = 1; i < nums.size(); i++){
            if(nums[i] > record[1]){
                if(flag2){
                    record[3] = record[2];
                    record[2] = record[1];
                    record[1] = nums[i];
                    flag3 = 1;
                }
                else{
                    record[2] = record[1];
                    record[1] = nums[i];
                    flag2 = 1;
                }
            } 
            if(nums[i] < record[1]){
                if(flag2){
                    if(nums[i] > record[2]){
                        record[3] = record[2];
                        record[2] = nums[i];
                    }
                }
                else{
                    record[2] = nums[i];
                    flag2 = 1;
                }
            }
            if(flag2 && nums[i] < record[2]){
                if(flag3){
                    if(nums[i] > record[3]) record[3] = nums[i];
                }
                else{
                    record[3] = nums[i];
                    flag3 = 1;
                }
            } 
        }
        if(flag3) return record[3];
        return record[1];
    }
};
posted @ 2020-04-11 15:50  肥斯大只仔  阅读(113)  评论(0编辑  收藏  举报