给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
输入: [1,2,3]
输出: 6
示例 2:
输入: [1,2,3,4]
输出: 24
注意:
给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。
解析:
该题目中既有正数又有负数,所以有不同的结果。1、全部为负数,此时取最大的三个负数的乘积最大。2、全部为整数,和1中的情况一样。3、既有正数又有负数,则取三个正数的乘积和两个最小的负数和一个最大的正数乘积较大的那个。
通过上述分析,一共有三种可能,其实三种可能可以化为一种可能,就是不管哪种情况,结果都是三个最大数的乘积和一个最大数和两个最小数乘积中较大的那个。因此该题目最重要的就是找出最大的三个数和最小的两个数。一种方法是排序,另一种方法是遍历数组,查找所需要的数字。
排序代码:
int maximumProduct(vector<int>& nums)
{
sort(nums.begin(), nums.end());
int size = nums.size();
int twoAndOne = nums[0] * nums[1] * nums[size - 1];
int three = nums[size - 1] * nums[size - 2] * nums[size - 3];
return twoAndOne > three ? twoAndOne : three;
}
参考leetcode遍历数组代码:
int maximumProduct(vector<int>& nums)
{
int fMax = INT_MIN, sMax = INT_MIN, tMax = INT_MIN;
int fMin = INT_MAX, sMin = INT_MAX;
for( auto i:nums ){
if( i > fMax ){
tMax = sMax;
sMax = fMax;
fMax = i;
}
else if( i > sMax ){
tMax = sMax;
sMax = i;
}
else if( i > tMax )
tMax = i;
if( i < fMin ){
sMin = fMin;
fMin = i;
}
else if( i < sMin )
sMin = i;
}
return max( fMax*sMax*tMax, fMax*fMin*sMin );
}