输入: 非空整数数组 nums(可能包含重复元素)。
要求: 返回数组中第三大的不同数字;如果不存在第三大的不同数字,则返回数组中的最大值。
输出: 整数(第三大或最大值)。
思路:
题眼是“第三大”指的是不同数字的第三大,所以必须去重。
用一次遍历维护三个变量:
max1:当前最大值max2:当前第二大(不同值)max3:当前第三大(不同值)
初始化都为 LLONG_MIN,避免数组里有 INT_MIN 时冲突。
遍历每个元素 v 时:
- 先去重:如果
v等于max1/max2/max3,直接跳过。 - 然后把
v放进这三个槽位里(类似插入排序的三格版):v > max1:整体后移:max3=max2, max2=max1, max1=v- 否则如果
v > max2:max3=max2, max2=v - 否则如果
v > max3:max3=v
遍历结束:
- 如果
max3还是没被填过(仍为LLONG_MIN),说明不足三个不同数,返回max1 - 否则返回
max3
复杂度:
- 时间复杂度:O(N)
- 空间复杂度:O(1)
class Solution {
public:
int thirdMax(vector<int>& nums) {
long long max1 = LLONG_MIN, max2 = LLONG_MIN, max3 = LLONG_MIN;
for (int x : nums) {
long long v = x;
// 去重:只统计“不同数字”的排名
if (v == max1 || v == max2 || v == max3) continue;
if (v > max1) {
max3 = max2;
max2 = max1;
max1 = v;
} else if (v > max2) {
max3 = max2;
max2 = v;
} else if (v > max3) {
max3 = v;
}
}
return (max3 == LLONG_MIN) ? (int)max1 : (int)max3;
}
};
738

被折叠的 条评论
为什么被折叠?



