这是一道Leetcode的一道题(难度标记为easy)给定一个非空的数组,但是觉得这个题还是很有意思的,就将这个题记录一下,供大家参考。
题目描述
首先上题目:
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).
上面题目的大致意思为:给定一个非空的整数数组,找出整个数组的第三大的整数,如果不存在,那么返回整个数组中的最大的那个数。整个算法的时间复杂度必须在O(n)。
解题思路
整个算法的时间复杂度必须在控制在O(n)区间内,这就保证了我们的算法从原则上只需要遍历数组一遍。这里我采用的思路就是:利用3个变量来记录数字中的第一大,第二大,第三大的变量,并且另外3个变量来记录这3个数是否来存在,然后遍历数组中的每个元素,每遍历一个元素,根据大小来改变数组中对应的变量。
程序代码
这里我为了方便,提供了Java的源代码,这里仅供大家参考:
class Solution {
public int thirdMax(int[] nums) {
int second = 0; // 记录第二大的元素
int third = 0; // 记录第三大的元素
boolean[] exists = {false, false, false}; // 初始化,最初默认3个数都不存在
int first = nums[0]; // 由于数组非空,初始化第一大的元素
exists[0] = true; // 第一大的数已经存在,更改对应的布尔变量
for (int i = 1; i < nums.length; i++) {
if (nums[i] > first) { // 如果是当前最大的数
third = second; // 下面2行分别对当前的数进行移位,第二大变为第三大,第一大变为第二大
second = first;
first = nums[i]; // 更新最大的数
exists[2] = exists[1]; // 同时更新对应的布尔变量
exists[1] = exists[0];
exists[0] = true;
} else if (nums[i] == first) { // 如果与最大的数相等 则进行下一次循环
continue;
} else {
if (exists[1] == true) { // 如果当前第二大的数存在
if (nums[i] > second) { // 如果当前值大于第二大的值
third = second; // 和上面的代码类似 进行以为 同时更新对应的布尔变量
second = nums[i];
exists[2] = exists[1];
exists[1] = true;
} else if (nums[i] == second) {
continue;
} else {
if (exists[2] == true) { // 如果第三大的数存在
if (nums[i] > third){ // 如果当前值比第三大的数要大 则更新第三大的数
third = nums[i];
exists[2] = true;
}
} else { //如果第三大的数不存在 那么就直接赋值
exists[2] = true;
third = nums[i];
}
}
} else { // 如果当前第二大的数不存在 则直接将当前值赋给第二大的值
exists[1] = true;
second = nums[i];
}
}
}
if (exists[2] == true) // 遍历结束, 如果第三大的数存在,则返回,如果不存在,则返回最大的
return third;
return first;
}
}
上面的代码满足了题目的要求,进行提交,可以看到代码的时间还是可以的。