问题

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3710 访问。

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

输入: [3, 2, 1]

输出: 1

解释: 第三大的数是 1.

输入: [1, 2]

输出: 2

解释: 第三大的数不存在, 所以返回最大的数 2 .

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

输出: 1

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


Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n).

Input: [3, 2, 1]

Output: 1

Explanation: The third maximum is 1.

Input: [1, 2]

Output: 2

Explanation: The third maximum does not exist, so the maximum (2) is returned instead.

Input: [2, 2, 3, 1]

Output: 1

Explanation: Note that the third maximum here means the third maximum distinct number.
Both numbers with value 2 are both considered as second maximum.


示例

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3710 访问。

public class Program {public static void Main(string[] args) {int[] nums = null;nums = new int[] { 3, 2, 1 };var res = ThirdMax(nums);Console.WriteLine(res);nums = new int[] { 3, 2, 1 };res = ThirdMax2(nums);Console.WriteLine(res);Console.ReadKey();}private static int ThirdMax(int[] nums) {Array.Sort(nums);int count = 0;for(int i = nums.Length - 1; i >= 1; i--) {if(nums[i] != nums[i - 1]) count++;if(count == 2) {return nums[i - 1];}}return nums[nums.Length - 1];}private static int ThirdMax2(int[] nums) {var sorted = new SortedSet<int>();for(int i = 0; i < nums.Length; i++) {sorted.Add(nums[i]);if(sorted.Count > 3) {sorted.Remove(sorted.ElementAt(0));}}return sorted.Count == 3 ? sorted.ElementAt(0) : sorted.ElementAt(sorted.Count - 1);}}

以上给出2种算法实现,以下是这个案例的输出结果:

该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3710 访问。

1
1

分析:

ThirdMax的时间复杂度取决于 Array.Sort() 方法所使用的排序算法:

  • 若使用基于比较的先进排序算法,其时间复杂度为:  ,加上一个线性的分析过程,其时间复杂度仍为:  ;
  • 若不使用基于比较的算法,而是使用计数、基数、桶排序等空间换时间的线性排序算法,那么ThirdMax的时间复杂度为2倍的线性,结果仍然为线性,即为:  。

ThirdMax2的时间复杂度不能直接认定是  ,因为使用了不重复的有序集合,每次添加数据都会导致sorted被重新排序。但是因为sorted中最多只包含3个数字(到达4时被删除1个),所以即便使用了糟糕的  的冒泡,其复杂度也仅为常数 9,即为常量时间内完成排序。在这种情况下ThirdMax2的时间复杂度应该为9倍的线性,其结果仍然为线性,即为:  。

具体的时间复杂度的分析应该具体对待,如果把冒泡的内循环封装成一个方法,便认为冒泡是  那就贻笑大方了。

C#LeetCode刷题之#414-第三大的数(Third Maximum Number)相关推荐

  1. [Swift]LeetCode414. 第三大的数 | Third Maximum Number

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...

  2. leetcode(3)——414. 第三大的数(C++中的 set,::作用符号,迭代器),628 三个数的最大乘积(sort函数的用法)

    文章目录 前言 414 程序 疑惑 set ::在c++中什么意思 一.作用域符号: 二.全局作用域符号: 三.作用域分解运算符: C++ 迭代器 628 程序 疑惑 sort函数 前言 大佬的程序, ...

  3. Leetcode刷题(2)回文数

    最好的种树是十年前,其次是现在.歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主  放弃很容易但是坚持一定很酷     我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的 ...

  4. C#LeetCode刷题之#643-子数组最大平均数 I( Maximum Average Subarray I)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3728 访问. 给定 n 个整数,找出平均数最大且长度为 k 的连 ...

  5. C#LeetCode刷题之#628-三个数的最大乘积( Maximum Product of Three Numbers)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3726 访问. 给定一个整型数组,在数组中找出由三个数组成的最大乘 ...

  6. C#LeetCode刷题之#16-最接近的三数之和(3Sum Closest)

    目录 问题 示例 分析 问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3620 访问. 给定一个包括 n 个整数的 ...

  7. C#LeetCode刷题-数组

    数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...

  8. ​LeetCode刷题实战417:太平洋大西洋水流问题

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  9. C#LeetCode刷题-数学

    数学篇 # 题名 刷题 通过率 难度 2 两数相加 29.0% 中等 7 反转整数 C#LeetCode刷题之#7-反转整数(Reverse Integer) 28.6% 简单 8 字符串转整数 (a ...

  10. ​LeetCode刷题实战314:二叉树的竖直遍历

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

最新文章

  1. Object-C 有私有变量?私有方法?
  2. Html.ActionLink 几种重载方式说明及例子
  3. 时间管理神器:滴答清单之我最喜欢的特征
  4. 2 自动递增_有石CAD自动下单,1天工作量1小时完成
  5. 打开输入花里胡哨的特殊符号
  6. Navicat premiu的导入和导出
  7. 折扇的保养方法是什么?
  8. 为什么我们更宠爱“随机”梯度下降?(SGD)
  9. Revit二次开发示例:ModelessForm_ExternalEvent
  10. TCN-时间卷积网络
  11. 塞规公差带图_螺纹塞规公差及尺寸表
  12. 制作好的种子怎么上传服务器,用BT如何上传自己的文件?
  13. JavsScript
  14. 计算机标点符号怎么切换,标点符号转换键是什么?
  15. kvm显示器怎么切换服务器,kvm切换器一套键盘鼠标显示器的热键切换方法教程
  16. Nuxt SSR 服务端渲染 详解
  17. Java将查询到的List,list集合还嵌套一个list集合(把这个list集合和嵌套的list集合合并为一个list集合)
  18. java 打印机类printer_GitHub - 505058216/thermal_printer: Java实现网络小票打印机自定义无驱打印...
  19. 【金融科技前沿】区块链和数字经济(区块链的缘起,现状和发展、区块链技术架构和原理解析 、区块链应用和案例综述)
  20. U3D实现WebCamera显示

热门文章

  1. Ethercat解析(九)之过程数据
  2. 【今日CV 计算机视觉论文速览 第131期】Mon, 17 Jun 2019
  3. ajax通用格式 jquery版本
  4. 生成icon图标 1005 html 左上角icon图标
  5. 数组算法 中部删除数据 1202
  6. 索引-css-第二版-pyhui
  7. jquery-循环遍历
  8. slave_exec_mode参数跳过复制异常
  9. MetaMask以太坊钱包插件
  10. day10-协程遇到IO操作自动切换