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
给定一个数组,找出三个数产生的乘积最大。
可以对其进行排序,排序完成之后,最后免得三个数字自然相乘得到最大值,但是需要注意的就是可能会有负数的存在,这样的话最小的两个负数与最后一个数字相乘也可能会产生最大值。
class Solution {
public:
int maximumProduct(vector<int>& nums) {
sort(nums.begin(),nums.end());//排序
int count = nums.size();
return max(nums[count-1]*nums[count-2]*nums[count-3],nums[count-1]*nums[0]*nums[1]);//需要注意可能会有负数的情况
}
};
另一种也是需要找到三个最大的正数,或者两个最小的数也可能不是负数,只是最小的两个数)。
class Solution {
public:
int maximumProduct(vector<int>& nums) {
int firstPosNum = INT_MIN;//最大的正数
int secondPosNum = INT_MIN;//第二大的正数
int thirdPosNum = INT_MIN;//第三大的正数
int firstNegNum = INT_MAX;//最小的负数
int secondNegNum = INT_MAX;//第二小的负数
for (int i=0; i < nums.size(); i++) {
if(nums[i] > firstPosNum) {//替换大的
thirdPosNum = secondPosNum;
secondPosNum = firstPosNum;
firstPosNum = nums[i];
} else if(nums[i] > secondPosNum) {
thirdPosNum = secondPosNum;
secondPosNum = nums[i];
} else if (nums[i] > thirdPosNum) {
thirdPosNum = nums[i];
}
if(nums[i] < firstNegNum) {//替换小的
secondNegNum = firstNegNum;
firstNegNum = nums[i];
} else if(nums[i] < secondNegNum) {
secondNegNum = nums[i];
}
}
//cout << firstPosNum << "," << secondPosNum << "," << thirdPosNum << endl;
//cout << firstNegNum << "," << secondNegNum << endl;
int Pos = firstPosNum*secondPosNum*thirdPosNum;
int Neg = firstPosNum*firstNegNum*secondNegNum;
return max(Pos,Neg);
}
};