美文网首页算法
求出第三大的数,不存在则给出最大的数

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

作者: mapleLeaf_X | 来源:发表于2020-03-13 17:12 被阅读0次
    ==== 题目要求====

    (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上查看的时候,发现许多的人写出的算法比现在写的要优秀,可惜的是无法查看到他们的代码,革命尚未成功,仍需努力。
    同时,如果大家有更好的、更优秀的解题方案或思路,望告之。

    相关文章

      网友评论

        本文标题:求出第三大的数,不存在则给出最大的数

        本文链接:https://www.haomeiwen.com/subject/rhhanftx.html