Leetcode414

Leetcode414:第三大的数

题目描述

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

示例 1:输入: [3, 2, 1]

输出: 1
解释: 第三大的数是 1.

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

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

解法一:基于set的去重排序法

class Solution {
public:
    int thirdMax(vector<int>& nums) {
        set<int> a;
        a.insert(nums.cbegin(), nums.cend());
        vector<int> b;
        for (auto n : a)
            b.push_back(n);
        sort(b.begin(), b.end());
        reverse(b.begin(), b.end());
        if (b.size()>2)
            return b[2];
        else
            return b[0];

    }
};

解法二:基于set的有序性和唯一性

/*****************************************************
基于set的有序性和唯一性
利用set中元素的有序性和唯一性,将元素放入set中,
若set的size不小于3输出倒数第三个元素;
若set的size小于3,输出最后一个元素。
****************************************************/
class Solution2 {
public:
    int thirdMax(vector<int>& nums)
    {
        set<int> s(nums.begin(), nums.end()); //基于范围的初始化
        auto it = s.end();  //设置一个迭代器
        it--;
        if (s.size() >= 3) {   //因为set默认是按照升序排序的,所以最后应该返回倒数第三个数
            it--;
            it--;
        }
        return *it;    //迭代器解引用
    }
};

解法三:基于sort排序单标记法

class Solution3 {
public:
    int thirdMax(vector<int>& nums)
    {
        sort(nums.begin(), nums.end());
        int res, flag = 1;
        res = nums[nums.size() - 1];
        for (int i = nums.size() - 2; i >= 0; --i)
        {
            if (res != nums[i] && flag < 3)
            {
                res = nums[i];
                ++flag;
            }
        }
        if (flag == 3)
            return res;
        else
            return nums[nums.size() - 1];
    }
};

main()函数

#include "stdafx.h"
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

int main()
{
    vector<int> nums;
    int Size;
    cout << "请输入数组的大小: " << endl;
    cin >> Size;
    int Currval;
    cout << "请输入数组的元素:" << endl;
    for (int i = 0; i < Size; i++)
    {
        cin >> Currval;
        nums.push_back(Currval);
    }
    Solution answer;
    cout << "数组中第3大的数字为: " << answer.thirdMax(nums) << endl;

    system("pause");
    return 0;
}

   转载规则


《Leetcode414》 赵小亮 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
Leetcode724 Leetcode724
Leetcode724:寻找数组的中心索引 题目描述给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法。 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和。 如果数组不存在中
2020-04-24
下一篇 
剑指offer39 剑指offer39
剑指offer39:数组中出现次数超过一半的数字 题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因
2020-04-23
  目录