🍀 三个数的最大乘积
描述:
# 给你一个整型数组 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
思考:
数组中三个数的最大乘积,数组长度大于等于三,很容易想到经过排序后得到最大三个数的乘积,但是有一个问题,如果是[-4, -1, 2, 3]那么后面最大的是-6,其实最大乘积是12!
- 如果后面三个数有三个负数[-4, -3, -2, -1],直接后面三个相乘最大。
- 如果后面三个数有两个负数[-4, -3, -2, 1],后面三个相乘和前面两个以及后面一个相乘作比较。
- 如果后面三个数有一个负数[-4, -3, 2, 1],后面三个相乘和前面两个以及后面一个相乘作比较。
- 如果后面三个数没有负数[1, 2, 3, 4],直接后面三个相乘最大。
总结:后面三个相乘和前面两个以及后面一个相乘作比较就可以了!
实现:
public class Solution {
public int maximumProduct(int[] nums) {
int len = nums.length;
int max1, max2;
Arrays.sort(nums);
max1 = nums[len - 1] * nums[len - 2] * nums[len - 3];
max2 = nums[len - 1] * nums[1] * nums[0];
return max1 > max2 ? max1 : max2;
}
}
测试一下!
大佬的代码:
不用排序,找出最大的3个和最小的2个数。和上一个数组题的思想很相似!
O(n)时间,O(1)空间,击败了 97.45% 的用户!!!
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 (auto &i : nums) {
if (i < min1) {
min2 = min1;
min1 = i;
} else if (i < min2) {
min2 = i;
}
if (i > max1) {
max3 = max2;
max2 = max1;
max1 = i;
} else if (i > max2) {
max3 = max2;
max2 = i;
} else if (i > max3) {
max3 = i;
}
}
return max(min1*min2*max1, max1*max2*max3);
}
};