LeetCode 414. Third Maximum Number

414. Third Maximum Number (第三大的数)

链接:

  

  https://leetcode-cn.com/problems/third-maximum-number/

题目:

  

  给定一个非空数组,返回此数组中第三大的数。如果不存在,则返回数组中最大的数。要求算法时间复杂度必须是O(n)。

  示例 1:

  输入: [3, 2, 1]

  输出: 1

  解释: 第三大的数是 1.
  示例 2:

  输入: [1, 2]

  输出: 2

  解释: 第三大的数不存在, 所以返回最大的数 2 .
  示例 3:

  输入: [2, 2, 3, 1]

  输出: 1

  解释: 注意,要求返回第三大的数,是指第三大且唯一出现的数。
  存在两个值为2的数,它们都排第二。

思路:

  简单题目挖了坑,不能直接用排序函数运算,O(n)就只能遍历一遍,所以设置one,two,three表示第一大第二大第三大三个数,遍历比较即可。这里还有两个坑,第一个是存在相同数字的可能性,这个在开始时比较一下就行了。另外一个是,输入里面有-2147483648,需要考虑一下,加一个flag表示即可。遍历完成,如果数组中不相同的数大于等于3个,那么输出three,不然输出one。

代码:

 1 public static int thirdMax(int[] nums) 
 2     {
 3         if(nums.length==1)
 4             return nums[0];
 5         else if(nums.length==2)
 6             return Math.max(nums[0], nums[1]);
 7         int one=Integer.MIN_VALUE;
 8         int two=Integer.MIN_VALUE;
 9         int three=Integer.MIN_VALUE;
10         int tnum=0;
11         boolean flag=true;
12         for(int i=0;i<nums.length;i++)
13         {
14             if(flag&&nums[i]==Integer.MIN_VALUE)
15             {    
16                 tnum++;
17                 flag=false;
18             }
19             if(one == nums[i]||two == nums[i]||three == nums[i])
20                 continue;
21             
22             tnum++;
23             if(nums[i]>one)
24             {
25                 three=two;
26                 two=one;
27                 one=nums[i];                
28             }
29             else if(nums[i]>two)
30             {
31                 three=two;
32                 two=nums[i];                
33             }
34             else if(nums[i]>three)
35             {
36                 three=nums[i];                
37             }    
38         }
39         if(tnum>=3)
40             return three;
41         else 
42             return one;
43     }
原文地址:https://www.cnblogs.com/blogxjc/p/11118599.html