题目:
Given an integer array, find three numbers whose product is maximum and output the maximum product.
Example 1:Input: [1,2,3] Output: 6
Example 2:
Input: [1,2,3,4] Output: 24
Note:
The length of the given array will be in range [3,104] and all elements are in the range [-1000, 1000].
Multiplication of any three numbers in the input won’t exceed the range of 32-bit signed integer.
解释:
在数组中选择三个数,返回最大的乘积。注意数中是有负数的,所以就很麻烦,不能直接取三个最大的值求乘积。
事实上,最大值要么是三个最大数的乘积,要么是两个最小数(有可能是负数)和一个最大数的乘积。
python代码:
class Solution(object):
def maximumProduct(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
nums.sort();
max1=nums[-1]
max2=nums[-2]
max3=nums[-3]
min1=nums[0]
min2=nums[1]
return max(min1*min2*max1,max1*max2*max3)
c++代码:
class Solution {
public:
int maximumProduct(vector<int>& nums) {
sort(nums.begin(),nums.end());
int n=nums.size();
int max1=nums[n-1],max2=nums[n-2],max3=nums[n-3];
int min1=nums[0],min2=nums[1];
return max(min1*min2*max1,max1*max2*max3);
}
};
无序排序的解法,速度快就是有点烦:
class Solution {
public:
int maximumProduct(vector<int>& nums) {
int max1=INT_MIN,max2=INT_MIN,max3=INT_MIN,min1=INT_MAX,min2=INT_MAX;
for(auto num:nums)
{
if (num>max1)
{
max3=max2;
max2=max1;
max1=num;
}
else if(num>max2)
{
max3=max2;
max2=num;
}
else if(num>max3)
max3=num;
if(num<min1)
{
min2=min1;
min1=num;
}
else if(num<min2)
min2=num;
}
return max(min1*min2*max1,max1*max2*max3);
}
};
总结:
反正对于这种求乘积最大值的问题,一定要看一下数值范围,有可能出现负数的情况。