https://leetcode.com/problems/third-maximum-number/description/
Solution 1. Use a set
int thirdMax(vector<int>& nums) {
set<int> top3;
for(int n:nums){
if(top3.size()<3 || n> *top3.begin())
top3.insert(n);
if(top3.size()>3) top3.erase(top3.begin());
}
return (top3.size() == 3) ? *top3.begin() : *top3.rbegin();
}
Solution 2. Use pointers
int thirdMax(vector<int>& nums) {
int *p1 = &nums[0], *p2 = nullptr, *p3 = nullptr;
for(int i=0; i<nums.size(); i++) {
if(nums[i] > *p1) {
p3 = p2;
p2 = p1;
p1 = &nums[i];
}
else if(nums[i] == *p1) continue;
else if(!p2) p2 = &nums[i];
else if(nums[i] < *p1 && nums[i] > *p2) {
p3 = p2;
p2 = &nums[i];
}
else if(nums[i] == *p2) continue;
else if(!p3) p3 = &nums[i];
else if(nums[i] < *p2 && nums[i] > *p3 ) {
p3 = &nums[i];
}
}
if(p3) return *p3;
else return *p1;
}
Solution 3
int thirdMax(vector<int>& nums) {
int m1 = INT_MIN, m2 = INT_MIN, m3 = INT_MIN, i = 0;
for(int n : nums) {
if(n > m1) {
m3 = m2;
m2 = m1;
m1 = n;
i++;
}
else if(n < m1 && n > m2) {
m3 = m2;
m2 = n;
i++;
}
else if(n < m2 && n > m3 ) {
m3 = n;
i++;
}
else if(n == INT_MIN) i++;
}
if(m1>m2 && m2>m3 && i>=3) return m3;
else return m1;
}
No comments:
Post a Comment