力扣 628. 三个数的最大乘积

题目说明

给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积。

  • 给定的整型数组长度范围是[3,104],数组中所有的元素范围是[-1000, 1000]。
  • 输入的数组中任意三个数的乘积不会超出32位有符号整数的范围。

示例

例1

1
2
输入: [1,2,3]
输出: 6

例2

1
2
输入: [1,2,3,4]
输出: 24

笔者理解

此题是一道数组求解算法问题,在力扣题库中被定义为简单题。

解法

当笔者阅读完此题后,发现只要直接排序及考虑几种特殊情况即可,排序完之后,我们可以发现:

1、 数字全部为正数或者负数,取最大三个整数的乘积即可

2、 负数和正数都存在,且最小的两个负数的乘积较大,取最小两个负数的乘积再乘上最大正数

就让我们看看具体如何实现吧。

实现

1
2
3
4
5
6
7
8
9
10
public int maximumProduct(int[] nums) {
int size = nums.length;
//数组长度
Arrays.sort(nums);
//将数组排序
int max = nums[size-3]*nums[size-2]*nums[size-1]>nums[0]*nums[1]*nums[size-1]
?nums[size-3]*nums[size-2]*nums[size-1]:nums[0]*nums[1]*nums[size-1];
//最大值可能为最大三个数乘积,也可能为最小两个负数的乘积再乘上最大正数
return max;
}

时间和空间效率都较高,可见此解法比较适合此题;

image.png

总结

本题是今天的每日一题,难度只有简单,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。