414. 第三大的数-LeetCode(C++)

414. 第三大的数

题目

给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1
示例

示例 1:

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

示例 2:

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

示例 3:

输入:[2, 2, 3, 1]
输出:1
解释:注意,要求返回第三大的数,是指在所有不同数字中排第三大的数。
此例中存在两个值为 2 的数,它们都排第二。在所有不同数字中排第三大的数为 1 。
题解1 - set

遍历数组,用一个有序集合来维护数组中前三大的数。每遍历一个数,就将其插入有序集合,若有序集合的大小超过 3,就删除集合中的最小元素。这样可以保证有序集合的大小至多为 3,且遍历结束后,若有序集合的大小为 3,其最小值就是数组中第三大的数;若有序集合的大小不足 3,那么就返回有序集合中的最大值。

class Solution {
public:
    int thirdMax(vector<int> &nums) {
        set<int> s;
        for (int num : nums) {
            s.insert(num);
            if (s.size() > 3) {
                s.erase(s.begin());
            }
        }
        return s.size() == 3 ? *s.begin() : *s.rbegin();
    }
};
题解2 - 一次遍历
class Solution {
public:
    int thirdMax(vector<int> &nums) {
        long a = LONG_MIN, b = LONG_MIN, c = LONG_MIN;
        for (long num : nums) {
            if (num > a) {
                c = b;
                b = a;
                a = num;
            } else if (a > num && num > b) {
                c = b;
                b = num;
            } else if (b > num && num > c) {
                c = num;
            }
        }
        return c == LONG_MIN ? a : c;
    }
};
C++相关语法: <set> 头文件中的set

set 是 C++ 标准模板库(STL)中的一个容器类,它基于平衡二叉搜索树(通常是红黑树)实现。set 容器中的元素是唯一的,并且是自动排序的。元素的排序是基于元素的比较函数,对于内置数据类型(如 intdouble 等),它使用 < 运算符来比较元素。

以下是 set 的一些主要特性:

  1. 唯一性set 中的元素不能重复,如果尝试插入一个已存在的元素,该元素不会被加入到 set 中。

  2. 排序set 中的元素是按照升序自动排序的。

  3. 不包含重复元素:即使插入操作尝试添加重复元素,set 也不会包含重复元素。

  4. 高效的查找、插入和删除操作set 提供对数时间复杂度的查找、插入和删除操作。

  5. 迭代器set 提供了迭代器,可以用于遍历元素。

  6. 成员函数set 提供了一系列的成员函数,如 insert()erase()find()size()empty() 等。

函数:

  1. 构造函数
    • set(): 默认构造函数,创建一个空的 set。
    • set(initializer_list<T> init): 创建一个包含指定初始化列表中元素的 set。
  2. 迭代器
    • begin(): 返回指向第一个元素的迭代器。
    • end(): 返回一个指向 set 结束位置的迭代器。
    • rbegin(): 返回一个反向迭代器,指向最后一个元素。
    • rend(): 返回一个反向迭代器,指向第一个元素之前的位置。
  3. 容量
    • size(): 返回 set 中元素的数量。
    • max_size(): 返回 set 可以容纳的最大元素数量。
    • empty(): 检查 set 是否为空。
  4. 修改器
    • clear(): 清空 set 中的所有元素。
    • insert(T value): 插入一个元素。
    • emplace(Args&&... args): 就地构造一个元素,插入到 set 中。
    • erase(iterator pos): 删除指定迭代器指向的元素。
    • erase(T value): 删除指定值的第一个匹配元素。
    • swap(set& other): 交换两个 set 的内容。
  5. 访问器
    • count(T value): 返回指定值的元素数量(在 set 中,总是返回 0 或 1)。
    • find(T value): 查找具有指定值的元素的迭代器。
1. `s.end()`:返回一个迭代器,它指向 `set` 中最后一个元素之后的位置。这个迭代器不指向任何有效的元素,通常用于表示 `set` 的结束。如果你尝试解引用 `s.end()`,程序将试图访问一个不存在的元素,这将导致未定义行为。
2. `s.rbegin()`:返回一个反向迭代器,它指向 `set` 中的最后一个元素,即最大的元素。反向迭代器允许你从后向前遍历 `set`。
#include <iostream>
#include <set>

int main() {
    // 创建一个空的 set
    std::set<int> mySet;

    // 使用初始化列表创建一个 set
    std::set<int> mySetWithList = {1, 2, 3, 4, 5};

    // 插入元素
    mySet.insert(10);
    mySet.insert(5);
    mySet.insert(20);

    // 检查 set 是否为空
    if (!mySet.empty()) {
        std::cout << "The set is not empty." << std::endl;
    }

    // 获取 set 的大小
    std::cout << "The size of the set is: " << mySet.size() << std::endl;

    // 获取 set 可以容纳的最大元素数量
    std::cout << "The max size of the set is: " << mySet.max_size() << std::endl;

    // 遍历 set
    std::cout << "The elements in the set are:" << std::endl;
    for (int num : mySet) {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    // 查找元素
    if (mySet.find(5) != mySet.end()) {
        std::cout << "5 is found in the set." << std::endl;
    } else {
        std::cout << "5 is not found in the set." << std::endl;
    }

    // 计算元素数量
    if (mySet.count(10) > 0) {
        std::cout << "There is 1 element with value 10 in the set." << std::endl;
    }

    // 删除元素
    mySet.erase(5);

    // 清空 set
    mySet.clear();

    // 检查 set 是否为空
    if (mySet.empty()) {
        std::cout << "The set is now empty." << std::endl;
    }

    return 0;
}
C++相关语法: <climits><cfloat> 头文件中的

在 C++ 中,LONG_MIN 是定义在头文件 <climits> 中的一个宏,它代表 long 类型能表示的最小值。long 是 C++ 中的一种整数类型,通常至少占用 32 位。

  1. INT_MIN:定义在 <climits> 中,表示 int 类型能表示的最小值。
  2. INT_MAX:定义在 <climits> 中,表示 int 类型能表示的最大值。
  3. LONG_MAX:定义在 <climits> 中,表示 long 类型能表示的最大值。
  4. LONG_MIN:定义在 <climits> 中,表示 long 类型能表示的最小值。

对于浮点数,C++ 标准库提供了一些宏来表示浮点数类型能表示的最小正规范化值、最大值、和非规范化(非零的最小值)等。这些宏定义在头文件 <cfloat><float.h>(C 语言的头文件,C++ 程序中也兼容)中。

以下是一些常用的浮点数相关的宏:

  1. FLT_MIN:表示 float 类型能表示的最小正规范化值。
  2. FLT_MAX:表示 float 类型能表示的最大值。
  3. DBL_MIN:表示 double 类型能表示的最小正规范化值。
  4. DBL_MAX:表示 double 类型能表示的最大值。
  5. LDBL_MIN:表示 long double 类型能表示的最小正规范化值。
  6. LDBL_MAX:表示 long double 类型能表示的最大值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值