题目描述
题目链接:leetcode-cn.com/problems/th…
思路分析
两种思路:
第一种,先准备一个数组来保存前三大的数,可以先预设一个比最小值海小的数,然后每次每遇到比数组中数字要大的数就放入数组将多出的位置覆盖掉,为了保证不出现重复的数,可以从前往后遍历,当一个数比当前位大,且比前一位小,则此时数组中没有这个数就可以放入。
第二种,使用Set去重后sort排序直接得到结果。
提交之前感觉思路二耗时会更久一些,但提交后发现思路二速度更快,不是很理解。
代码
-
思路1
var thirdMax = function (nums) {
let min = -1*2**31-1;
let arr = new Array(3).fill(min);
for (let num of nums) {
if (num > arr[0]) {
arr[2] = arr[1];
arr[1] = arr[0];
arr[0] = num;
} else if (num < arr[0] && num > arr[1]) {
arr[2] = arr[1];
arr[1] = num;
} else if (num < arr[1] && num > arr[2]) {
arr[2] = num;
}
}
return arr[2] != min ? arr[2] : arr[0];
};
-
思路2
var thirdMax = function (nums) {
return [...new Set(nums.sort((a, b) => b - a))][new Set(nums).size > 2 ? 2 : 0];
};