力扣 0628 三个数的最大乘积

警告
本文最后更新于 2022-08-07,文中内容可能已过时。

628. 三个数的最大乘积

  • 全是非负数:选择最大的三个非负数,即最大的三个数
  • 至少两个非负数,只有一个负数:
    • 至少三个非负数:选择最大的三个非负数,即最大的三个数
    • 只有两个非负数:只有三个数可以选择,即最大的三个数
  • 至少一个非负数,只有两个负数:
    • 至少三个非负数:选择最大的三个非负数,即最大的三个数;或者选择两个负数和最大的一个非负数,即最小的两个数和最大的一个数
    • 只有两个非负数:选择两个负数和最大的一个非负数,即最小的两个数和最大的一个数
    • 只有一个非负数:只有三个数可以选择,即最大的三个数
  • 全是负数:选择最小的三个负数,即最大的三个数

综上,结果为最大的三个数最小的两个数和最大的一个数中的更大值。

  • 排序
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
class Solution {
    public int maximumProduct(int[] nums) {
        Arrays.sort(nums);
        int n = nums.length;
        return Math.max(
            nums[n - 1] * nums[n - 2] * nums[n - 3], // 最大的三个数
            nums[n - 1] * nums[0] * nums[1]          // 最小的两个数和最大的一个数
        );
    }
}
  • 不排序
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
    public int maximumProduct(int[] nums) {
        int max1, max2, max3, min1, min2; // 最大的三个数、最小的两个数
        max1 = max2 = max3 = Integer.MIN_VALUE;
        min1 = min2 = Integer.MAX_VALUE;
        for (int x : nums) {
            if (x > max1) {
                max3 = max2;
                max2 = max1;
                max1 = x;
            } else if (x > max2) {
                max3 = max2;
                max2 = x;
            } else if (x > max3) {
                max3 = x;
            }
            if (x < min1) {
                min2 = min1;
                min1 = x;
            } else if (x < min2) {
                min2 = x;
            }
        }
        return Math.max(max1 * max2 * max3, max1 * min1 * min2);
    }
}