三个数的最大乘积
难度:
标签:
题目描述
代码结果
运行时间: 35 ms, 内存: 16.9 MB
/*
* 思路:
* 1. 使用Java Stream对数组进行排序。
* 2. 使用Stream相关操作找到三个最大的正数和两个最小的负数。
* 3. 计算两种可能的最大乘积,返回其中的最大值。
*/
import java.util.Arrays;
import java.util.stream.IntStream;
public class Solution {
public int maximumProduct(int[] nums) {
// 排序后获取最大的三个数和最小的两个数
int[] sorted = IntStream.of(nums).sorted().toArray();
int n = sorted.length;
// 计算两种可能的最大乘积
int product1 = sorted[n - 1] * sorted[n - 2] * sorted[n - 3]; // 三个最大的正数
int product2 = sorted[0] * sorted[1] * sorted[n - 1]; // 两个最小的负数和一个最大的正数
// 返回最大值
return Math.max(product1, product2);
}
}
解释
方法:
该题解的思路是在数组中维护最大的三个数和最小的两个数。遍历数组,对于每个元素,检查它是否比当前最大的三个数中的任意一个更大,或者比当前最小的两个数中的任意一个更小。如果满足条件,就更新对应的最大数或最小数,并保持它们按照大小顺序排列。最后,返回最大的三个数的乘积与最大数与最小的两个数的乘积中的较大值。
时间复杂度:
O(n)
空间复杂度:
O(1)
代码细节讲解
🦆
如何确保在更新最大或最小值时,不会错误地覆盖掉其它重要的最大或最小值?
▷🦆
在更新最大的三个数或最小的两个数时,为什么选择在更新后排序,而不是在比较前就维护好序列顺序?
▷🦆
函数`sort_max`和`sort_min`中的比较和交换是否可能导致不必要的操作,即使数值没有发生改变?
▷🦆
当元素可能同时更新最大值和最小值数组时,如何处理这种情况以避免潜在的错误或遗漏?
▷