前言说明
算法学习,日常刷题记录。
题目连接
题目内容
给你一个整型数组nums,在数组中找出由三个数组成的最大乘积,并输出这个乘积。
示例1:
输入:nums = [1,2,3]
输出:6
示例2:
输入:nums = [1,2,3,4]
输出:24
示例3:
输入:nums = [-1,-2,-3]
输出:-6
提示:
3 <= nums.length <= 10^4
-1000 <= nums[i] <= 1000
分析过程
分三种情况分析。
第一种情况,全部是正数,最大乘积 = 第一最大值 * 第二最大值 * 第三最大值。
第二种情况,全部是负数,最大乘积 = 第一最大值 * 第二最大值 * 第三最大值。
第三种情况,有正数也有负数,最大乘积是以下两种情况中的一种,取最大值。
1、最大乘积 = 第一最大值 * 第二最大值 * 第三最大值,取最大的是三个数,这种情况很好理解,这里就不细说了。
2、最大乘积 = 第一最小值 * 第二最小值 * 第一最大值,这种情况是,绝对值中最小值那一侧比最大值那一侧要大,所以取最小值那一侧的两个最小值,因为两个负数相乘为正数,所以只取第一最小值和第二最小值,再乘以第一最大值。
所以首先对数组nums进行排序,获取第一最小值、第二最小值、第一最大值、第二最大值、第三最大值,计算以上两种情况的乘积,取最大值就是答案。
解答代码
class Solution {
public int maximumProduct(int[] nums) {
// 对数组nums排序
Arrays.sort(nums);
// 取第一最小值
int min1 = nums[0];
// 取第二最小值
int min2 = nums[1];
// 取第一最大值
int max1 = nums[nums.length - 1];
// 取第二最大值
int max2 = nums[nums.length - 2];
// 取第三最大值
int max3 = nums[nums.length - 3];
// 若全部是正数,最大乘积=第一最大值*第二最大值*第三最大值
// 若全部是负数,最大乘积=第一最大值*第二最大值*第三最大值
// 若有正数也有负数,最大乘积是以下两种情况中的一种,取最大值
// 第一种情况,第一最大值*第二最大值*第三最大值
int product1 = max1 * max2 * max3;
// 第二种情况,第一最小值*第二最小值*第一最大值,因为如果数组中有正数也有负数时,两个负数相乘得到正数
int product2 = min1 * min2 * max1;
// 取两种情况中的最大值
return Math.max(product1, product2);
}
}
提交结果
执行用时12ms,时间击败70.88%的用户,内存消耗39.9MB,空间击败37.04%的用户。
运行结果原文链接
原文链接:三个数的最大乘积
网友评论