leetcode:414.第三大的数
题目:
给你一个非空数组,返回此数组中 第三大的数 。如果不存在,则返回数组中最大的数。
示例 1:
输入:[3, 2, 1] 输出:1 解释:第三大的数是 1 。
示例 2:
输入:[1, 2] 输出:2 解释:第三大的数不存在, 所以返回最大的数 2 。
示例 3:
输入:[2, 2, 3, 1] 输出:1
解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。 存在两个值为2的数,它们都排第二。
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
一步步分析:
- 拿到手的第一步,我想的就是排序,却忽略一个问题:如果输入1111.或者2223331111的时候,输出的nums【2】并不是第三大的数字。所以此思路不理想
- 随后看了Java的解析,分析如下:
- 设定三个数,one,two,three,遍历数组;
- 输入的数字大于one时,让 three = two; two = one; 然后one更替为输入的数字;
- 输入的数字在one与two之间时,one不变,将three变成two,two变成输入数字;
- 输入的数字在two与three之间时,one和two都不变,将输入的数字替换原有的three;
- 注意:当输入的数字与one或two或three相同的时候,我们不改变原有的三个数的值,只是让程序继续往后运行,不退出for循环,但是结束if语句(使用continue)
but(我认为比较重要的新知识来了)
- 在运行的时候,我们会发现一个问题,系统输入了一个很大的数字,已经超出int的范围。但是这时候如果将范围固定(用if语句确定输入的数字大小),则会出现没有return值的操作,不符合leetcode的标准模式
- 解决办法:
- 我们将one,two,three 都赋值为数据结构long中的最小值时,则可以避免这种错误
- 这里就需要我们了解各种语言的数据类型的最大最小值如何赋值,我在这里只介绍C++中的赋值方法
具体链接:
【链接】关于c++中如何获取各种数据类型的最大值和最小值
class Solution {
public:
int thirdMax(vector<int>& nums) {
int n = nums.size();
//特殊:
if(n == 1)
return nums[0];
if(n == 2)
return nums[0]>nums[1] ? nums[0] : nums[1];
//将其赋值为long型的最小数字
long one =LONG_MIN;
long two = LONG_MIN;
long three = LONG_MIN;
//遍历数组
for(int i = 0;i < n;i++){
if(nums[i] == one||nums[i] == two)
continue;
//输入数字大于one
if(nums[i] > one){
three = two;
two = one;
one = nums[i];
}else
//输入数字小于one,大于two
if(nums[i] > two){
three = two;
two = nums[i];
}else
//输入数字大于three,小于two
if(nums[i] > three){
three = nums[i];
}
}
//特例输入,比如11113333,此时输出应该时最大值,为one
return (three == LONG_MIN) ? one : three;
}
};