==== 题目要求====
(1)非空的整数数组;
(2)如果存在的话求出第三大的数,否则求出最大的数。
(3)时间复杂度要求在O(n);
Example 1:
Input: [3, 2, 1]
Output: 1
Explanation: The third maximum is 1.
Example 2:
Input: [1, 2]
Output: 2
Explanation: The third maximum does not exist, so the maximum (2) is returned instead.
Example 3:
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.
例子就直接引用LeetCode上边的了(嘿嘿)。
==== 解题思路 ====
从上述的例子和题目可以知道,有两个需要注意的点。
首先,要考虑是否存在第三大的数;
其次,<font color=#f00>第三大的数</font>,那么就必须是大于,而不是大于等于(像Example 3)。
清楚了上述的两个点,那么这个问题就不难。
解题步骤:
(1)将数组nums去重,得到新的数组newNums;
(2)判断newNums的长度,如果长度小于3,则返回数组的最大值,否则进行下一步;
(3.1)将数组排序(由大到小),直接返回newNums[2]。
(3.2)求出数组的最大值,然后将其删除,接着求最大值,再删除,最后求出最大值并将其返回。
在(2)的基础,有两种方法可以求解(3.1和3.2)。
3.1的js代码
/**
* @param {number[]} nums
* @return {number}
*/
var thirdMax = function(nums) {
let set = new Set(nums);
let newNums = [...set];
let len = newNums.length;
if(len < 3) {
return Math.max(...newNums);
}
newNums.sort((x,y)=>{
return y-x;
});
return newNums[2];
};
3.2的js代码
/**
* @param {number[]} nums
* @return {number}
*/
var thirdMax = function(nums) {
let set = new Set(nums);
let newNums = [...set];
let len = newNums.length;
if(len < 3) {
return Math.max(...newNums);
}
for(let i = 0; i < 2; i++){
let max = Math.max(...newNums);
set.delete(max);
newNums = [...set];
}
return Math.max(...newNums);
};
==== 总结 ====
到此,这个问题算是搞一个段落了,但是仍需努力。
在LeetCode上查看的时候,发现许多的人写出的算法比现在写的要优秀,可惜的是无法查看到他们的代码,革命尚未成功,仍需努力。
同时,如果大家有更好的、更优秀的解题方案或思路,望告之。
网友评论