领扣(LeetCode)第三大的数 个人题解
给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。
示例 1:
输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1.
示例 2:
输入: [1, 2] 输出: 2 解释: 第三大的数不存在, 所以返回最大的数 2 .
示例 3:
输入: [2, 2, 3, 1] 输出: 1 解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
存在两个值为2的数,它们都排第二。 第一次遇到这个题目,想到的办法就是定义三个数,第一大,第二大,第三大,然后依次判断。这个办法行之有效。但是最开始没写出来正确答案,因为没有考虑到去重的问题。
由于考虑到去重,所以我又想到用集合来解决,把数组放到集合里面去,放的时候就去掉重复的元素,最后得到一个没有重复的集合。然后再对集合进行排序,判断是否有第三大的数,最后得到正确答案。
但是这样做,算法的复杂度就达到了O(n2)的级别。虽然能得到正确答案,也能通过领扣的测试,成功AC,但是速度之低令人发指,只打败了提交的1%的人。
代码如下:
class Solution {
public int thirdMax(int[] nums) {
Vector v=new Vector();
for (int i : nums) {
if(!v.contains(i))
v.add(i);
}
v.sort(null);
if(v.size()>=3)
return (int) v.get(v.size()-3);
else
return (int) v.get(v.size()-1);
}
}
然后重新思考最开始的做法,他的算法复杂度是O(n),然后参考了相关的代码,发现可以使用Integer这个JAVA内封装好的类,设置值为null,来表示未被放置过的数。同时,加了忽略掉重复的元素逻辑,成功AC。
代码如下:
class Solution {
public int thirdMax(int[] nums) {
Integer fmax = null, smax = null, tmax = null;
for (int i : nums) {
if ((fmax != null && fmax == i) || (smax != null && smax == i) || (tmax != null && tmax == i))
continue;
if (fmax == null || i > fmax) {
tmax = smax;
smax = fmax;
fmax = i;
} else if (smax == null || i > smax) {
tmax = smax;
smax = i;
} else if (tmax == null || i > tmax) {
tmax = i;
}
}
return tmax == null ? fmax : tmax;
}
}
领扣(LeetCode)第三大的数 个人题解的更多相关文章
- leetcode 第三大的数
给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2 ...
- 领扣[LeetCode]从零开始[使用C++][1,10]
0.序 以后不做后端开发是不是就用不到C++了?真香.话不多说,我已经躺倒在第一题上了.不贴题目了,持续更新. 1.两数之和 原文:https://www.cnblogs.com/grandyang/ ...
- LeetCode 第三大的数414. Third Maximum Number
题目 描述:给定数组中求第三大的数字:如果没有,返回最大的:时间复杂度O(n) 记得<剑指offer>才看到过这样的求第k大的题目.但是忘记具体怎么做了.只好先自己想了. 因为时间复杂度的 ...
- [LeetCode] Third Maximum Number 第三大的数
Given a non-empty array of integers, return the third maximum number in this array. If it does not e ...
- 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 ...
- 领扣-1/167 两数之和 Two Sum MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- LeetCode 414. 第三大的数(Third Maximum Number) 3
414. 第三大的数 414. Third Maximum Number 题目描述 给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是 O(n). 每 ...
- 【LeetCode】414. 第三大的数
给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2 ...
- 【leetcode 简单】 第九十八题 第三大的数
给定一个非空数组,返回此数组中第三大的数.如果不存在,则返回数组中最大的数.要求算法时间复杂度必须是O(n). 示例 1: 输入: [3, 2, 1] 输出: 1 解释: 第三大的数是 1. 示例 2 ...
随机推荐
- Cocos2d-x 学习笔记(15.4) EventDispatcher 事件分发具体逻辑 dispatchEventToListeners函数
dispatchEvent(Event* event)方法在对事件对应的监听器进行重新排序后,进行事件分发操作.具体操作由dispatchEventToListeners方法执行. 该方法声明: vo ...
- 使用Prometheus监控SpringBoot应用
通过之前的文章我们使用Prometheus监控了应用服务器node_exporter,数据库mysqld_exporter,今天我们来监控一下你的应用.(本文以SpringBoot 2.1.9.REL ...
- Python开发【第七篇】列表
问题:当我们要用一系列数字的时候,我们需要将数字进行存储,我们就需要找个容器把数字装起来,我们需要用的时候再拿出来.如何将计算机运算的数据存储在一个地方,同时方便 对数据进行 增.删.改.查 列表 列 ...
- opencv::像素重映射
像素重映射(cv::remap) 简单点说就是把输入图像中各个像素按照一定的规则映射到另外一张图像的对应位置上去,形成一张新的图像. Remap( InputArray src, // 输入图像 Ou ...
- python深拷贝与浅拷贝的区别
可变对象:一个对象在不改变其所指向的地址的前提下,可以修改其所指向的地址中的值 不可变对象:一个对象所指向的地址上值是不能修改的,如果你修改了这个对象的值,那么它指向的地址就改变了,相当于你把这个对象 ...
- 使用 pdf.js 在网页中加载 pdf 文件
在网页中加载并显示PDF文件是最常见的业务需求.例如以下应用场景:(1)在电商网站上购物之后,下载电子发票之前先预览发票.(2)电子商务管理系统中查看发布的公文,公文文件一般是PDF格式的文件. 目前 ...
- MAC idea&eclipse快捷键--笔记
idea: 1. command+d 删除行 2. command+o 重写父类方法 3. option+command+v 自动补全变量 4. 将普通java项目变成maven项目 在项目名称上点 ...
- Java线程池的正确关闭方法,awaitTermination还不够
问题说明 今天发现了一个问题,颠覆了我之前对关闭线程池的认识. 一直以来,我坚信用shutdown + awaitTermination关闭线程池是最标准的方式. 不过,这次遇到的问题是,子线程用到B ...
- day07整理(内置方法\循环判断)
目录 一.上节课回顾 (一)if判断 1.单分支结构 2.双分支结构 3.多分支结构 (二)for循环 1.for + break 2.for + continue 3.for循环嵌套 (三)robu ...
- Javascript对this对象的理解
在JavaScript中this表示函数运行的时候自动生成的一个内部对象,只能在函数内部使用,下面是一个简单的例子: function test(){ alert(this == window); } ...