作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/third-maximum-number/description/

题目描述

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).

Example 1:

  1. Input: [3, 2, 1]
  2. Output: 1
  3. Explanation: The third maximum is 1.

Example 2:

  1. Input: [1, 2]
  2. Output: 2
  3. Explanation: The third maximum does not exist, so the maximum (2) is returned instead.

Example 3:

  1. Input: [2, 2, 3, 1]
  2. Output: 1
  3. Explanation: Note that the third maximum here means the third maximum distinct number.
  4. Both numbers with value 2 are both considered as second maximum.

题目大意

找出一个数组中第三大的数字,如果不存在的话,就返回最大数字。

解题方法

替换最大值数组

最基本的方法,找到最大值,然后每次把最大值移除,这样重复三次就得到了第三大的值。

  1. class Solution(object):
  2. def thirdMax(self, nums):
  3. """
  4. :type nums: List[int]
  5. :rtype: int
  6. """
  7. def setMax(nums):
  8. _max = max(nums)
  9. for i, num in enumerate(nums):
  10. if num == _max:
  11. nums[i] = float('-inf')
  12. return _max
  13. max1 = setMax(nums)
  14. max2 = setMax(nums)
  15. max3 = setMax(nums)
  16. return max3 if max3 != float('-inf') else max(max1, max2)

使用set

用set去算,set的时间复杂度是O(n)。set的remove()方法可以去除某个值,不过每次只能去除一个。

  1. class Solution(object):
  2. def thirdMax(self, nums):
  3. """
  4. :type nums: List[int]
  5. :rtype: int
  6. """
  7. nums_set = set(nums)
  8. if len(nums_set) < 3:
  9. return max(nums_set)
  10. nums_set.remove(max(nums_set))
  11. nums_set.remove(max(nums_set))
  12. _max = max(nums_set)
  13. return _max

这个方法的C++版本如下:

  1. class Solution {
  2. public:
  3. int thirdMax(vector<int>& nums) {
  4. set<int> s;
  5. for (int num : nums) {
  6. s.insert(num);
  7. }
  8. if (s.size() < 3) {
  9. return maxset(s);
  10. }
  11. s.erase(maxset(s));
  12. s.erase(maxset(s));
  13. return maxset(s);
  14. }
  15. private:
  16. int maxset(set<int> &s) {
  17. int res = INT_MIN;
  18. for (int c : s) {
  19. res = max(res, c);
  20. }
  21. return res;
  22. }
  23. };

原来C++也有求最大值函数叫做max_element(),参数是起始和结束位置,返回的是指针。

  1. class Solution {
  2. public:
  3. int thirdMax(vector<int>& nums) {
  4. set<int> s;
  5. for (int num : nums) {
  6. s.insert(num);
  7. }
  8. if (s.size() < 3) return *max_element(s.begin(), s.end());
  9. s.erase(*max_element(s.begin(), s.end()));
  10. s.erase(*max_element(s.begin(), s.end()));
  11. return *max_element(s.begin(), s.end());
  12. }
  13. };

三个变量

维护三个变量分别保存最大、次大、第三大的值,只需要遍历一次数组,找到这个数字和三个变量的大小关系,就能对应的更新对应的值。

为了去重,elif里面写了当前的Num要处于开区间内。

  1. class Solution(object):
  2. def thirdMax(self, nums):
  3. """
  4. :type nums: List[int]
  5. :rtype: int
  6. """
  7. # s1 > s2 > s3
  8. s1, s2, s3 = float('-inf'), float('-inf'), float('-inf')
  9. for num in nums:
  10. if num > s1:
  11. s1, s2, s3 = num, s1, s2
  12. elif num < s1 and num > s2:
  13. s2, s3 = num, s2
  14. elif num < s2 and num > s3:
  15. s3 = num
  16. return s3 if s3 != float('-inf') else s1

这个方法的C++写法如下,为什么需要使用long long 呢?因为当第三大的数字是INT_MIN的话,你如果把三个数字都初始化成了INT_MIN就没法判断了。

  1. class Solution {
  2. public:
  3. int thirdMax(vector<int>& nums) {
  4. long long s1, s2, s3;
  5. s1 = s2 = s3 = LLONG_MIN;
  6. for (int num : nums) {
  7. if (num > s1) {
  8. s3 = s2;
  9. s2 = s1;
  10. s1 = num;
  11. } else if (num < s1 && num > s2) {
  12. s3 = s2;
  13. s2 = num;
  14. } else if (num < s2 && num > s3) {
  15. s3 = num;
  16. }
  17. }
  18. return s3 != LLONG_MIN ? s3 : s1;
  19. }
  20. };

日期

2018 年 2 月 4 日
2018 年 11 月 27 日 —— 最近的雾霾太可怕

【LeetCode】414. Third Maximum Number 解题报告(Python & C++)的更多相关文章

  1. 【LeetCode】306. Additive Number 解题报告(Python)

    [LeetCode]306. Additive Number 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http: ...

  2. C#版 - Leetcode 414. Third Maximum Number题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  3. LeetCode 414. Third Maximum Number (第三大的数)

    Given a non-empty array of integers, return the third maximum number in this array. If it does not e ...

  4. LeetCode 414 Third Maximum Number

    Problem: Given a non-empty array of integers, return the third maximum number in this array. If it d ...

  5. 【LeetCode】263. Ugly Number 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 除去2,3,5因子 日期 [LeetCode] 题目 ...

  6. 【LeetCode】136. Single Number 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 异或 字典 日期 [LeetCode] 题目地址:h ...

  7. 【LeetCode】507. Perfect Number 解题报告(Python & Java & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  8. 【LeetCode】 202. Happy Number 解题报告(Java & Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 迭代 日期 [LeetCode] 题目地址:h ...

  9. 【LeetCode】268. Missing Number 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 求和 异或 日期 题目地址:https://leet ...

随机推荐

  1. mongodb-to-mongodb

    python3用于mongodb数据库之间倒数据,特别是分片和非分片之间. 本项目是一个集合一个集合的倒. 参考了logstash,对于只增不减而且不修改的数据的可以一直同步,阻塞同步,断点同步.改进 ...

  2. Spark3学习【基于Java】3. Spark-Sql常用API

    学习一门开源技术一般有两种入门方法,一种是去看官网文档,比如Getting Started - Spark 3.2.0 Documentation (apache.org),另一种是去看官网的例子,也 ...

  3. Java、Scala类型检查和类型转换

    目录 Java 1.类型检查 2.类型转换 Scala 1.类型检查 2.类型转换 Java 1.类型检查 使用:变量 instanceof 类型 示例 String name = "zha ...

  4. 一道题目学ES6 API,合并对象id相同的两个数组对象

    var arr2=[{id:1,name:'23'}] var arr1=[{id:1,car:'car2'}] const combined = arr2.reduce((acc, cur) =&g ...

  5. Oracle—回车、换行符

    1.回车换行符 chr(10)是换行符, chr(13)是回车, 增加换行符: select ' update ' || table_name || ' set VALID_STATE =''0A'' ...

  6. mybatis-plus解析

    mybatis-plus当用lambda时bean属性不要以is/get/set开头,解析根据字段而不是get/set方法映射

  7. 【编程思想】【设计模式】【结构模式Structural】front_controller

    Python版 https://github.com/faif/python-patterns/blob/master/structural/front_controller.py #!/usr/bi ...

  8. springmvc中的异常处理方法

    //1.自定义异常处理类       2.编写异常处理器    3.配置异常处理器 package com.hope.exception;/** * 异常处理类 * @author newcityma ...

  9. 【C/C++】拔河比赛/分组/招商银行

    题目:小Z组织训练营同学进行一次拔河比赛,要从n(2≤n≤60,000)个同学中选出两组同学参加(两组人数可能不同).对每组同学而言,如果人数超过1人,那么要求该组内的任意两个同学的体重之差的绝对值不 ...

  10. Jenkins 关闭和重启的实现方式

    关闭jenkins 只需要在访问jenkins服务器的网址url地址后加上exit.例如我jenkins的地址http://localhost:8080/ , 那么我只需要在浏览器地址栏上敲下 htt ...