leetcode:414.第三大的数(8 ms 8.7 MB)

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;
    
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_42198265/article/details/114587586
8.7