原文链接:628. 三个数的最大乘积 - 力扣(LeetCode)
题目
给你一个整型数组 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
题解
方法一:
解题思路
排序后,只需考虑最小的两个值及最大的值的乘积 和 最大的三个值的乘积
class Solution {
public int maximumProduct(int[] nums) {
Arrays.sort(nums);
//排序后,最末尾的三个一定是该数组中最大的
int sum1 = nums[nums.length-3]*nums[nums.length-2]*nums[nums.length-1];
//接下来解决负负得正的情况
//从头开始寻找两个负数
//因为排序后最开始的两个负数相乘最大,再与末尾的相乘
int sum2 = nums[0]*nums[1]*nums[nums.length-1];
//比较两种情况哪个最大
return sum1>sum2?sum1:sum2;
}
}
时间:11ms 空间:42.6MB
方法二:
解题思路
不做排序,直接循环查找
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);
}
}
时间:2ms 空间:42.5MB