原题链接Third Maximum Number

要求找到给定数组中第三大的数。其中第一大的数,第二大的数,第三大的数互不相同,即严格的小于关系。并且规定时间复杂度是O(n)。另外如果找不到第三大的数,则返回数组中第一大的数

可以用三个变量first, second, third分别记录第一大第二大以及第三大的数,初始化时是整数范围的最小值,在随后遍历数组的过程中进行比较(假设遍历到的数用n表示)

  • 如果n大于first, 则将second赋值给third, first赋值给second,n赋值给first
  • 如果n大于second小于first,则将second赋值给thid,n赋值给second
  • 如果n大于third,则将n赋值给third

这样实现有一些局限性,如果输入的数组中包含整数的最小值(即first,second,third的初始值INT32_MIN),那么就无法区分到底是找到了第三大的数(它的值是INT32_MIN)还是没有找到(因为third的值没有改变)

解决方法时将初始值设置的再小一点,即INT64_MIN,但是如果输入的数组包含的数据偏偏就是64位的就没有办法了

代码实现如下

class Solution {
public:int thirdMax(vector<int>& nums) {// 因为int的范围小于long long int的范围,所以这种方式可解// 但是如果输入的是vector<long long int> 就没有办法了long long int first = INT64_MIN, second = INT64_MIN, third = INT64_MIN;for(auto& n : nums) {// 如果小于third或者和第一/二大的数相等,则不进行赋值 if(n <= third || n == second || n == first) {continue;}third = n;// 进行大小比较后交换数据if(third > second) swap(second, third);if(second > first) swap(first, second);}return third == INT64_MIN ? first : third;}
};

鉴于上述的局限性,需要换一种思路解决,但是对于时间复杂度的要求就无法满足了。

考虑到题目中要求的时间复杂度是O(n),而二叉搜索树插入删除的时间复杂度是O(lgn),所以可以考虑用set实现,同时也可以受益于set的去重能力,总的时间复杂度是O(nlogn)

代码实现如下

class Solution {
public:int thirdMax(vector<int>& nums) {set<int> s;for(auto& n : nums) {s.emplace(n);if(s.size() > 3) {s.erase(s.begin());}}return s.size() == 3 ? *s.begin() : *s.rbegin();}
};

每天一道LeetCode-----找到给定数组中第三大的值相关推荐

  1. 每天一道LeetCode-----在给定数组中找到一个子数组,使得这个子数组的元素乘积最大

    Maximum Product Subarray 原题链接Maximum Product Subarray 在给定数组中找到一个子数组,使得这个子数组元素的乘积最大.给定数组中可能有正数,负数和0 思 ...

  2. 《LeetCode力扣练习》第448题 找到所有数组中消失的数字 Java

    <LeetCode力扣练习>第448题 找到所有数组中消失的数字 Java 一.资源 题目: 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你 ...

  3. leetcode(3)——697. 数组的度(C++版本注释)(map容器),448. 找到所有数组中消失的数字(取余操作,C++中的auto类型)

    文章目录 前言 697 程序 思路 收获 map容器 448 程序 收获 取模操作的思考 auto 前言 大佬的程序,边刷边总结边学语言. 题目697 697 程序 class Solution {p ...

  4. 每天一道LeetCode-----找到给定数组的连续子数组,使这个子数组的和最大,要求复杂度为O(n)

    Maximum Subarray 原题链接Maximum Subarray 在给定数组中找到一个子数组(连续),使这个子数组的和最大. O(n2)的解法是求sum[i] - sum[j]的最大值,形如 ...

  5. 找到所有数组中消失的数字_【一点资讯】千万程序员的呼声:面试如何拿到大厂Offer?这份阅读量超过11W+的算法刷题宝典请你原地查收 www.yidianzixun.com...

    如何才能通过面试拿到大厂Offer? "刷leetcode!" 这是我听到最多的回答! 现在越来越多的人应聘工作时都得先刷个几十百来道题,不刷题感觉都过不了面试. 无论是面测试.算 ...

  6. 【算法】数组与矩阵问题——找到无序数组中最小的k个数

    1 /** 2 * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) 3 * 过程: 4 * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 5 * 在堆里的k个元素中堆顶 ...

  7. js选出给定数组中所有的偶数/奇数/n的倍数(filter)

    js选出给定数组中所有的偶数/奇数/n的倍数(filter) 1.选出给定数组中所有的偶数 用for function collect_all_even(collection) {let res = ...

  8. LeetCode 540. 有序数组中的单一元素(c语言实现)

    540. 有序数组中的单一元素 给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次. 请你找出并返回只出现一次的那个数. 你设计的解决方案必须满足 O(log n) 时间 ...

  9. 2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums

    2021-12-19:找到所有数组中消失的数字. 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums ...

最新文章

  1. 腾讯极客攻破iPhone刷脸解锁,凭一副眼镜,转走熟睡用户的钱
  2. redis 未授权访问详解
  3. python 插入排序算法
  4. Metasploit Framework(1)基本命令、简单使用
  5. Codeforces 918D/917B - MADMAX
  6. 南阳71(独木舟上的旅行)
  7. Linux系统下 MongoDB安装搭建
  8. TCP粘包问题的解决方案01——自定义包体
  9. 11.消息摘要算法之MD5
  10. 删除链表倒数第N个节点
  11. Word转pdf方法小结
  12. ROS动态IP端口映射
  13. 锂电池容量电压对照表_锂电池保护板与电池管理系统分别是什么?有什么作用?...
  14. C#拾遗补阙【01】:字符串
  15. Adobe Flash Professional CS5挂起挂起,安装不成功
  16. 如何快速学会三子棋游戏
  17. C++第33课--C++中的字符串类
  18. CAD基础+常用快捷(三)
  19. 【论文阅读】Region Proposal by Guided Anchoring
  20. Linux新手上路(六):文件打包和解压缩

热门文章

  1. 如何在服务器上运行python程序_在服务器上配置运行(每天一则段子python程序)...
  2. 黑客数字雨html单页,Hei客帝国数字雨.html
  3. centos 6.3 mysql python 模块_CentOS安装python2.6以及MySQL-python
  4. 如何简单的在 ASP.NET Core 中集成 JWT 认证?
  5. ACM学习历程—Hihocoder 1290 Demo Day(动态规划)
  6. 【linux】学习笔记
  7. 谈.Net委托与线程——解决窗体假死
  8. delphi——用线程创建一个窗体笔记
  9. php程序变量,PHP 变量
  10. PHP控制转盘抽奖代码,PHP 根据概率 实现抽奖转盘算法 代码