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.
此题容易绕进去。如何选择最大的乘积和。开始想的按绝对值大小排好序,然后先取两个,若同号则找下一个正值,异号则找负值。但这样不能保证最大,所以又得考虑第二第三做组合接着选择第三个。因此考虑另一种思路。
若取得最大乘积,可分为两种情况,第一种全正值,第二种两副值一正值。那么最终的结果从这两组里产生,
接下来就是要保证这两种组合是属于该累中的最大值,考虑第一种,即取正数最大的三个。考虑第二种则一定是取最小的两个负数再加一个最大正数。
因此代码如下:
class Solution {
public:
int maximumProduct(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
return nums[n-1]*nums[n-2]*nums[n-3] > nums[0]*nums[1]*nums[n-1] ? nums[n-1]*nums[n-2]*nums[n-3] :nums[0]*nums[1]*nums[n-1];
}
};
考虑该代码的细节:
直接进行排序,取最后面三位乘积和最前面两位加最后面一位的乘积做比较。
这种情况思路如之前所说。但要简单思考不满足两种类型的情况。
意思是后三个数不一定都是正数,这种情况发生的条件是,数组中正数本来就不足,那么这个时候可以自行将情况细分考虑(比较容易想出)。
还有前两个不都是负数,也是条件是负数不足。
最终考虑细节不会影响到最终判断。