628. Maximum Product of Three Numbers

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:

  1. The length of the given array will be in range [3,104] and all elements are in the range [-1000, 1000].
  2. 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];
    }
};

考虑该代码的细节:

直接进行排序,取最后面三位乘积和最前面两位加最后面一位的乘积做比较。

这种情况思路如之前所说。但要简单思考不满足两种类型的情况。

意思是后三个数不一定都是正数,这种情况发生的条件是,数组中正数本来就不足,那么这个时候可以自行将情况细分考虑(比较容易想出)。

还有前两个不都是负数,也是条件是负数不足。

最终考虑细节不会影响到最终判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值