414 第三大的数
class Solution {
public:
int thirdMax(vector<int>& nums) {
//回顾一下,sort() O(nlogn) *max_element() O(n)
int n = nums.size();
if(n<3){return *max_element(nums.begin(),nums.end());}
sort(nums.begin(),nums.end());
for(int i = n-3 ; i > 0 ; --i){
if(nums[i] != nums[i+1]){return nums[i];}
}
return 1;
}
};
但是提交时,[1,1,2]这个案例就出现了问题,很明显它的没有第三大数的前提不是nums.size()>3而是nums中要包含三个不同的数字。
class Solution {
public:
int nInNums(vector<int>& nums){
int count = 0 , n =nums.size();
if(n == 1){return 1;}
sort(nums.begin(),nums.end());
for(int i = 0; i < n-1 ; i++){
if(nums[i] != nums[i+1]){
count++;
if(i == n-2){count++;}
}
}
if(nums[n-1] == nums[n-2]){count++;}
return count;
}
int thirdMax(vector<int>& nums) {
//回顾一下,sort() O(nlogn) *max_element() O(n)
int n = nums.size() , c = nInNums(nums);
if(c<3){return *max_element(nums.begin(),nums.end());}
sort(nums.begin(),nums.end());
int count = 0;
for(int i = n-1 ; i > 0 ; --i){
if(nums[i] != nums[i-1]){count++;}
if(count == 3){return nums[i];}
}
if(count < 3){return nums[0];}
return 1;
}
};
这个解法就挺暴力的,而且太复杂了,缝缝补补又三遍的感觉。提示中又说可以将时间复杂度优化至O(n)。
class Solution {
public:
int thirdMax(vector<int>& nums) {
//第三大?直接找三个数?一个一个比较?
int max = *max_element(nums.begin(),nums.end()) , n = nums.size();
int secondMax = INT_MIN , ans = INT_MIN ;
bool isExit = 0;
for(int i = 0 ; i < n ; i++){
if(nums[i] < max){
nums[i] > secondMax?secondMax = nums[i]:1;
}
}
for(int i = 0 ; i < n ; i++){
if(nums[i] < secondMax){
nums[i] > ans?ans = nums[i]:1;
isExit = 1;
}
}
if(isExit == 0){return max;}
else{return ans;}
}
};
官方题解给出了【有序集合】的解题思路,使用set<int> 基于红黑树(BST)实现的数据结构,特点是:有序,不重复,从小到大这种,不能随机访问。
class Solution {
public:
int thirdMax(vector<int>& nums) {
set<int> s;
int c = 2;
for(int n : nums){
s.insert(n);
if(s.size()>3){
s.erase(s.begin());
}
}
return s.size() == 3? *s.begin() : *s.rbegin();
}
};
628 三个数的最大乘积
class Solution {
public:
int maximumProduct(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
return max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
}
};
感觉今天状态不太对,这两个题都没有完全独立完成。