外观
乘积最大的三个数字
⭐ 题目日期:
字节 - 25届秋招
🌳 题目描述:
给定一个数组 有正数 负数 和 0 ,找出乘积最大的三个数字
🧗难度系数:
⭐️ ⭐️ ⭐
📝思路分析:
要找到乘积最大的三个数字,我们需要考虑两种情况:
- 情况一:最大的三个数相乘,即 max1 * max2 * max3
- 情况二:最小的两个数(可能是负数)和最大的数相乘,即 min1 * min2 * max1
取上述两种情况的较大值,即为所求的最大乘积。
初始化五个变量:
- max1:初始化为 Integer.MIN_VALUE,用于存储最大值
- max2:初始化为 Integer.MIN_VALUE,用于存储第二大值
- max3:初始化为 Integer.MIN_VALUE,用于存储第三大值
- min1:初始化为 Integer.MAX_VALUE,用于存储最小值
- min2:初始化为 Integer.MAX_VALUE,用于存储第二小值
遍历数组 nums,对于每个元素 num,更新上述五个变量:
- 更新 max1、max2、max3:
- 如果 num > max1,则更新 max1 = num,max2 = max1,max3 = max2
- 否则如果 num > max2,则更新 max2 = num,max3 = max2
- 否则如果 num > max3,则更新 max3 = num
- 更新 min1、min2:
- 如果 num < min1,则更新 min1 = num,min2 = min1
- 否则如果 num < min2,则更新 min2 = num
计算两种乘积:
- product1 = max1 * max2 * max3
- product2 = min1 * min2 * max1
返回较大的乘积:
return Math.max(product1, product2)
💻代码:
Java
public int maximumProduct(int[] nums) {
int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
for (int num : nums) {
if (num > max1) {
max3 = max2;
max2 = max1;
max1 = num;
} else if (num > max2) {
max3 = max2;
max2 = num;
} else if (num > max3) {
max3 = num;
}
if (num < min1) {
min2 = min1;
min1 = num;
} else if (num < min2) {
min2 = num;
}
}
int product1 = max1 * max2 * max3;
int product2 = min1 * min2 * max1;
return Math.max(product1, product2);
}
🚵🏻复杂度分析:
时间复杂度:O(n), 线性扫描数组中所有的元素,每个元素,常数级操作。
空间复杂度:O(1), 用于几个常量的存储