给你一个整型数组 nums ,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例 1:
**输入:** nums = [1,2,3]
**输出:** 6
示例 2:
**输入:** nums = [1,2,3,4]
**输出:** 24
示例 3:
**输入:** nums = [-1,-2,-3]
**输出:** -6
提示:
- 3 <= nums.length <= 104
- -1000 <= nums[i] <= 1000
方法一:排序
首先将数组排序。
如果数组中全是非负数,则排序后最大的三个数相乘即为最大乘积;如果全是非正数,则最大的三个数相乘同样也为最大乘积。
如果数组中有正数有负数,则最大乘积既可能是三个最大正数的乘积,也可能是两个最小负数(即绝对值最大)与最大正数的乘积。
综上,我们在给数组排序后,分别求出三个最大正数的乘积,以及两个最小负数与最大正数的乘积,二者之间的最大值即为所求答案。
[sol1-C++]| 12
 3
 4
 5
 6
 7
 8
 
 | class Solution {public:
 int maximumProduct(vector<int>& nums) {
 sort(nums.begin(), nums.end());
 int n = nums.size();
 return max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
 }
 };
 
 | 
 [sol1-Java]| 12
 3
 4
 5
 6
 7
 
 | class Solution {public int maximumProduct(int[] nums) {
 Arrays.sort(nums);
 int n = nums.length;
 return Math.max(nums[0] * nums[1] * nums[n - 1], nums[n - 3] * nums[n - 2] * nums[n - 1]);
 }
 }
 
 | 
 [sol1-Golang]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | func maximumProduct(nums []int) int {sort.Ints(nums)
 n := len(nums)
 return max(nums[0]*nums[1]*nums[n-1], nums[n-3]*nums[n-2]*nums[n-1])
 }
 
 func max(a, b int) int {
 if a > b {
 return a
 }
 return b
 }
 
 | 
 [sol1-C]| 12
 3
 4
 5
 6
 7
 8
 
 | int cmp(int* a, int* b) {return *a - *b;
 }
 
 int maximumProduct(int* nums, int numsSize) {
 qsort(nums, numsSize, sizeof(int), cmp);
 return fmax(nums[0] * nums[1] * nums[numsSize - 1], nums[numsSize - 3] * nums[numsSize - 2] * nums[numsSize - 1]);
 }
 
 | 
 [sol1-JavaScript]| 12
 3
 4
 5
 
 | var maximumProduct = function(nums) {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]);
 };
 
 | 
 复杂度分析
方法二:线性扫描
在方法一中,我们实际上只要求出数组中最大的三个数以及最小的两个数,因此我们可以不用排序,用线性扫描直接得出这五个数。
[sol2-C++]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 
 | class Solution {public:
 int maximumProduct(vector<int>& nums) {
 
 int min1 = INT_MAX, min2 = INT_MAX;
 
 int max1 = INT_MIN, max2 = INT_MIN, max3 = INT_MIN;
 
 for (int x: nums) {
 if (x < min1) {
 min2 = min1;
 min1 = x;
 } else if (x < min2) {
 min2 = x;
 }
 
 if (x > max1) {
 max3 = max2;
 max2 = max1;
 max1 = x;
 } else if (x > max2) {
 max3 = max2;
 max2 = x;
 } else if (x > max3) {
 max3 = x;
 }
 }
 
 return max(min1 * min2 * max1, max1 * max2 * max3);
 }
 };
 
 | 
 [sol2-Java]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 
 | class Solution {public int maximumProduct(int[] nums) {
 
 int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
 
 int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
 
 for (int x : nums) {
 if (x < min1) {
 min2 = min1;
 min1 = x;
 } else if (x < min2) {
 min2 = x;
 }
 
 if (x > max1) {
 max3 = max2;
 max2 = max1;
 max1 = x;
 } else if (x > max2) {
 max3 = max2;
 max2 = x;
 } else if (x > max3) {
 max3 = x;
 }
 }
 
 return Math.max(min1 * min2 * max1, max1 * max2 * max3);
 }
 }
 
 | 
 [sol2-Golang]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 
 | func maximumProduct(nums []int) int {
 min1, min2 := math.MaxInt64, math.MaxInt64
 
 max1, max2, max3 := math.MinInt64, math.MinInt64, math.MinInt64
 
 for _, x := range nums {
 if x < min1 {
 min2 = min1
 min1 = x
 } else if x < min2 {
 min2 = x
 }
 
 if x > max1 {
 max3 = max2
 max2 = max1
 max1 = x
 } else if x > max2 {
 max3 = max2
 max2 = x
 } else if x > max3 {
 max3 = x
 }
 }
 
 return max(min1*min2*max1, max1*max2*max3)
 }
 
 func max(a, b int) int {
 if a > b {
 return a
 }
 return b
 }
 
 | 
 [sol2-C]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 
 | int maximumProduct(int* nums, int numsSize) {
 int min1 = INT_MAX, min2 = INT_MAX;
 
 int max1 = INT_MIN, max2 = INT_MIN, max3 = INT_MIN;
 
 for (int i = 0; i < numsSize; i++) {
 int x = nums[i];
 if (x < min1) {
 min2 = min1;
 min1 = x;
 } else if (x < min2) {
 min2 = x;
 }
 
 if (x > max1) {
 max3 = max2;
 max2 = max1;
 max1 = x;
 } else if (x > max2) {
 max3 = max2;
 max2 = x;
 } else if (x > max3) {
 max3 = x;
 }
 }
 
 return fmax(min1 * min2 * max1, max1 * max2 * max3);
 }
 
 | 
 [sol2-JavaScript]| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 
 | var maximumProduct = function(nums) {
 let min1 = Number.MAX_SAFE_INTEGER, min2 = Number.MAX_SAFE_INTEGER;
 
 let max1 = -Number.MAX_SAFE_INTEGER, max2 = -Number.MAX_SAFE_INTEGER, max3 = -Number.MAX_SAFE_INTEGER;
 
 for (const x of nums) {
 if (x < min1) {
 min2 = min1;
 min1 = x;
 } else if (x < min2) {
 min2 = x;
 }
 
 if (x > max1) {
 max3 = max2;
 max2 = max1;
 max1 = x;
 } else if (x > max2) {
 max3 = max2;
 max2 = x;
 } else if (x > max3) {
 max3 = x;
 }
 }
 
 return Math.max(min1 * min2 * max1, max1 * max2 * max3);
 };
 
 | 
 复杂度分析