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 类型能表示的最大值。
LeetCode是一个知名的在线编程平台,为程序员和算法爱好者提供了丰富的资源和练习机会。 ### 平台功能 - **题目资源丰富**:拥有超过两千道算法题目,涵盖了各种难度级别,包括简单、中等和困难。这些题目类型多样,涉及组、字符串、链表、树、图、动态规划等众多算法据结构领域,能满足不同水平学习者的需求[^1]。 - **支持多种编程语言**:支持如Python、Java、C++、JavaScript等几十种编程语言。用户可以根据自己的喜好和实际需求选择合适的语言来解决问题,方便不同背景的开发者进行练习和学习[^1]。 - **代码评测系统**:当用户提交代码后,LeetCode会立即对代码进行评测。它会使用多组测试用例来验证代码的正确性和性能,并给出详细的反馈,包括代码是否通过所有测试用例、运行时间、内存消耗等信息,帮助用户了解自己代码的优劣[^1]。 - **竞赛活动**:定期举办周赛和双周赛等竞赛活动。在竞赛中,参与者需要在规定时间内完成一定量的题目,根据解题量和用时进行排名。竞赛不仅能锻炼用户的解题能力和时间管理能力,还能让用户与其他开发者进行竞争和交流,了解自己在全球开发者中的水平[^1]。 - **社区交流**:拥有庞大的社区,用户可以在社区中分享解题思路、讨论算法问题、发表代码优化建议等。社区中还有许多高质量的题解和文章,为用户提供了学习和交流的平台,有助于拓宽思维和提高编程水平[^1]。 ### 适用人群 - **求职者**:对于正在准备技术面试的求职者来说,LeetCode是一个非常有用的工具。许多科技公司在面试过程中会考察算法据结构相关的知识,通过在LeetCode上练习题目,求职者可以熟悉常见的面试题型和解题思路,提高自己的面试竞争力[^1]。 - **学生**:计算机专业的学生可以利用LeetCode来巩固课堂上学到的算法据结构知识。通过实际动手解决问题,加深对理论知识的理解和掌握,提高编程能力和解决实际问题的能力[^1]。 - **算法爱好者**:对于喜欢研究算法和挑战自我的人来说,LeetCode提供了一个不断挑战和提升自己的平台。可以通过尝试解决各种高难度的题目,探索新的算法据结构,享受解决复杂问题的乐趣[^1]。 ### 使用方法 - **注册账号**:访问LeetCode官方网站,使用邮箱或第三方账号(如Google、GitHub等)进行注册。注册成功后,即可登录平台开始使用[^1]。 - **选择题目**:在题目列表中,可以根据题目类型、难度级别、标签等条件筛选出自己想要练习的题目。也可以通过搜索功能直接查找特定的题目[^1]。 - **编写代码**:点击进入题目详情页后,选择自己熟悉的编程语言,在代码编辑器中编写解题代码。可以使用平台提供的代码模板和调试工具来辅助开发[^1]。 - **提交代码**:编写完代码后,点击提交按钮,平台会对代码进行评测。如果代码通过所有测试用例,则表示解题成功;否则,需要根据评测反馈对代码进行修改和优化[^1]。 - **学习交流**:解题完成后,可以查看社区中的题解和讨论,学习他人的解题思路和优化方法。也可以将自己的解题思路和代码分享到社区中,与其他用户进行交流和互动[^1]。 以下是一个使用Python解决LeetCode上经典的两之和问题的示例代码: ```python def twoSum(nums, target): hashmap = {} for i, num in enumerate(nums): complement = target - num if complement in hashmap: return [hashmap[complement], i] hashmap[num] = i return [] # 示例调用 nums = [2, 7, 11, 15] target = 9 print(twoSum(nums, target)) ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值