求出第三大的数,不存在则给出最大的数

==== 题目要求====

(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上边的了(嘿嘿)。

==== 解题思路 ====

从上述的例子和题目可以知道,有两个需要注意的点。
首先,要考虑是否存在第三大的数;
其次,第三大的数,那么就必须是大于,而不是大于等于(像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上查看的时候,发现许多的人写出的算法比现在写的要优秀,可惜的是无法查看到他们的代码,革命尚未成功,仍需努力。
同时,如果大家有更好的、更优秀的解题方案或思路,望告之。

你可能感兴趣的:(求出第三大的数,不存在则给出最大的数)