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.
思路:
1.排序后进行选择;
2.遍历。考虑到
1)三个数都是非负数,那这三个数都是正数中最大的;
2)三个都是负数,那这三个数都是负数中最大的;
3)两负一正,两负一定是负数中最小的,正数是最大的;
归纳为,找三个最大的和两个最小的,进行积的比较
代码1:
class Solution {
public:
int maximumProduct(vector<int>& nums) {
vector<int>::iterator max1,max2,max3,min1,min2,min3;
int vmax1,vmax2,vmax3,vmin1,vmin2,vmin3;
int result=0;
max1=max_element(nums.begin(),nums.end());
vmax1=*max1;
nums.erase(max1);
max2=max_element(nums.begin(),nums.end());
vmax2=*max2;
nums.erase(max2);
min1=min_element(nums.begin(),nums.end());
vmin1=*min1;
nums.erase(min1);
// 3 numbers
if(nums.size()==0) {
result = (vmax1)*(vmin1)*(vmax2);
return result;
}
// 4 numbers
else if(nums.size()==1){
int temp1 = (vmax1)*(nums[0])*(vmax2);
int temp2 = (nums[0])*(vmin1)*(vmax1);
return temp1>temp2?temp1:temp2;
}
// 5 numbers
else if(nums.size()==2){
min2=min_element(nums.begin(),nums.end());
vmin2=*min2;
nums.erase(min2);
int temp1 = (vmax1)*(nums[0])*(vmax2);
int temp2 = (vmax1)*(vmin1)*(vmin2);
return temp1>temp2?temp1:temp2;
}
else{
min2=min_element(nums.begin(),nums.end());
vmin2=*min2;
nums.erase(min2);
max3=max_element(nums.begin(),nums.end());
vmax3=*max3;
nums.erase(max3);
int temp1 = (vmax1)*(vmax2)*(vmax3);
int temp2 = (vmax1)*(vmin1)*(vmin2);
return temp1>temp2?temp1:temp2;
}
}
};
代码2:
class Solution {
public:
int maximumProduct(vector<int>& nums) {
auto max1=max_element(nums.begin(),nums.end());
int vmax1=*max1;
nums.erase(max1);
auto max2=max_element(nums.begin(),nums.end());
int vmax2=*max2;
nums.erase(max2);
auto max3=max_element(nums.begin(),nums.end());
int vmax3=*max3;
nums.erase(max3);
int res;
if(nums.size()==0){res=vmax1*vmax2*vmax3;}
else if(nums.size()==1) {vmax1*vmax2*vmax3>vmax1*vmax2*nums[0]?res=vmax1*vmax2*vmax3:res=vmax1*vmax2*nums[0];}
else{
auto min1=min_element(nums.begin(),nums.end());
int vmin1=*min1;
nums.erase(min1);
auto min2=min_element(nums.begin(),nums.end());
int vmin2=*min2;
nums.erase(min2);
vmax1*vmax2*vmax3>vmax1*vmin2*vmin1?res=vmax1*vmax2*vmax3:res=vmax1*vmin2*vmin1;
}
return res;
}
};
代码3:
int maximumProduct(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
int temp1 = nums[n-1]*nums[n-2]*nums[n-3];
int temp2 = nums[0]*nums[1]*nums[n-1];
return temp1>temp2?temp1:temp2;
}