1.题目描述
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:

示例 2:

示例 3:

提示:
3 <= nums.length <= 104
-1000 <= nums[i] <= 1000
2.思路
1.如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。
2.如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。
因此,用线性扫描直接得出数组中最大的三个数以及最小的两个数,求出1,1中的最大者结尾答案。
3.代码
class Solution {
public:
int maximumProduct(vector<int>& nums) {
int min1 = INT_MAX, min2 = INT_MAX;
int max1 = INT_MIN, max2 = INT_MIN, max3 = INT_MIN;
for(auto & num : nums){
if(num < min1){
min2 = min1;
min1 = num;
}
else if(num < min2){
min2 = num;
}
if(num > max1){
max3 = max2;
max2 = max1;
max1 = num;
}
else if(num > max2){
max3 = max2;
max2 = num;
}
else if(num > max3){
max3 = num;
}
}
return max(min1 * min2 * max1, max1 * max2 * max3);
}
};
4.复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)

本文介绍了一种算法,用于从整型数组中找到三个数的最大乘积。通过一次遍历找到最大的三个数及最小的两个数,进而计算出可能的最大乘积。
248

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



