题目
给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
思路
错误解法:
一开始看见时就想到用排序,因为排序完后我们就可以取到三个最大值,那么三个最大值相乘也就是最大乘积了,但是忽略了有负数的时候,负负相乘有可能会得到一个更大的数
正确解法
我们此时应考虑三种情况:
- 全是负数->最大的三个数的乘积为最大值
- 全是正数->最大的三个数的乘积为最大值
- 有负数有正数->乘积最大值可能为最大的三个正数,也有可能是最大的一个正数和两个最小的负数(因为它们的绝对值最大)的乘积
代码
那么我们现在就可以很简单的写出以下代码:
var maximumProduct = function(nums) {
//es6新特性:箭头函数
let nums2 = nums.sort((a,b)=>a-b);
const n = nums.length;
return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 1] * nums[n - 2] * nums[n - 3]);
复杂度
- 时间复杂度:O(NlogN)O(N\log N)O(NlogN),其中 NNN 为数组长度。排序需要 O(NlogN)O(N\log N)O(NlogN) 的时间。
- 空间复杂度:O(logN)O(\log N)O(logN),主要为排序的空间开销。