Leetcode628. 三个数的最大乘积

题意

在数组中找到三个数,使得这三个数字的乘积最大

思路

  • 需要注意的就是如果数组有正有负的时候,那么要考虑1⃣️一正两负2⃣️三正或三负这两种情况

  • 如果我们将这个数组进行排序,那么显然

    • 1⃣️是最小的两个数和最大的数
    • 2⃣️三正三负都是最大的三分数的乘积
  • 由分类讨论结果也可以得到不排序的算法,我们只要设置变量来记住最大的三个数 + 最小的两个数字分类计算结果最后比较就好了

代码(排序)

class Solution {
public:
    int maximumProduct(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        int len = nums.size();
        int last_three = nums[len - 1] * nums[len - 2] * nums[len - 3];
        if(nums[0] > 0 || nums[len - 1] < 0) {      //全正或全负
            return last_three;
        }else if(nums[0] < 0 && nums[1] < 0 && nums[len - 1] > 0) {     //2负1正
            int t = nums[0] * nums[1] * nums[len - 1];   
            if(t > last_three)      //和最后的三个数字的乘积进行比较
                return t;
            else    
                return last_three;
        }else   return last_three;
        return 0;
    }
};

代码(扫描)

class Solution {
public:
    int maximumProduct(vector<int>& nums) {
        int min1 = 1001, min2 = 1001; 
        int max1 = -1001, max2 = -1001, max3 = -1001;   //题目给定了数据范围
        for(auto e: nums) {
            if(e < min1) {       //比最小的min1,min2都还小
                min2 = min1;
                min1 = e;
            }else if(e < min2) {    //比min1大,但是比min2小
                min2 = e;
            }
            
            if(e > max3) {      //比最大的三个数都大
                max1 = max2;
                max2 = max3;
                max3 = e;
            }else if(e > max2) {    //比第2大的数字大,比最大的数小
                max1 = max2;
                max2 = e;
            }else if(e > max1) {    //比第3大的数字大,但是比第2大的数组小
                max1 = e;
            }
        }
        return max(min1 * min2 * max3, max1 * max2 * max3);
    }
};
上一篇:每日一淦2021.8.24


下一篇:CodeForces 489C