QUESTION
Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in 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.
THOUGHT I
首先对数组进行排序,把最后一个作为最大的一个数,然后从后往前进行遍历,遇到和最大的数相同的数就跳过,知道找到第二大的数。然后再从后往前遍历,遇到和最大的数或者第二大的数相同的数就跳过,直到找到第三大的数。
public class Solution {
public int thirdMax(int[] nums) {
Arrays.sort(nums);
int n = nums.length;
int one = nums[n - 1];
int two = Integer.MAX_VALUE;
int three = Integer.MAX_VALUE;
for(int i = n - 1;i >= 0;i--){
if(nums[i] == one)
continue;
two = nums[i];
break;
}
for(int i = n - 1;i >= 0;i--){
if(nums[i] == one || nums[i] == two)
continue;
three = nums[i];
break;
}
if(three == Integer.MAX_VALUE)
return one;
else
return three;
}
result
time compexity is O(nlogn),space complexity is O(1);
THOUGHT II
设置三个变量分别存储最大的三个数,从头遍历数组,如果比最大的大,咋把第二大的赋给第三大,第一大的赋给第二大。这里需要注意的是对于重复数的处理,count代表已经给三个变量赋过值得个数
代码
public class Solution {
public int thirdMax(int[] nums) {
int n = nums.length;
int one,two,three;
one = two = three = Integer.MIN_VALUE;
int count = 0;
for(int x : nums){
if(count >= 1 && x == one || count >= 2 && x == two)
continue;
if(x > one){
three = two;
two = one;
one = x;
count++;
}
else if( x > two){
three = two;
two = x;
count++;
}
else if(x >= three){
three = x;
count++;
}
}
if(count >= 3)
return three;
else
return one;
}
}
result
time complexity is O(n),space complexity isO (1);