QUESTION
easy
题目描述
给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入: [1,2,3]
输出: 6
示例 2:
输入: [1,2,3,4]
输出: 24
说明
- 给定的整型数组长度范围是 [3,104],数组中所有的元素范围是 [-1000, 1000]。
- 输入的数组中任意三个数的乘积不会超出 32 位有符号整数的范围。
SOLUTION
方法一
没啥好说的,排序即可,但注意有存在负数的情况。
class Solution {
public:
int maximumProduct(vector<int>& nums) {
int n = nums.size() - 1;
sort(nums.begin(), nums.end());
int tmp = nums[0] * nums[1] * nums[n];
return max(tmp, nums[n] * nums[n-1] * nums[n-2]);
}
};
方法二
但我依照我们的经验,我们曾经写过找到类似三个最小的数的题目,最好的方法可以用线性时间复杂度解决的,搬到这道题上来,我们需要找到三个最大的数和两个最小,一个最大的数。代码如下
class Solution {
public:
int maximumProduct(vector<int>& nums) {
int mx1 = INT_MIN, mx2 = INT_MIN, mx3 = INT_MIN;
int mn1 = INT_MAX, mn2 = INT_MAX;
for (int num : nums) {
//三个最大的数
if (num > mx1) {
mx3 = mx2;
mx2 = mx1;
mx1 = num;
}
else if (num > mx2) {
mx3 = mx2;
mx2 = num;
}
else if (num > mx3) {
mx3 = num;
}
//两个最小的数
if (num < mn1) {
mn2 = mn1;
mn1 = num;
}
else if (num < mn2) {
mn2 = num;
}
}
return max(mx1 * mx2 * mx3, mx1 * mn1 * mn2);
}
};