Bootstrap

7.4 数组简单 414 628

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]);
    }
};

感觉今天状态不太对,这两个题都没有完全独立完成。

;