[leetCode]628. 三个数的最大乘积

题目

链接:https://leetcode-cn.com/problems/maximum-product-of-three-numbers

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

示例 1:

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

示例 2:

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

注意:

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

排序

  1. 如果数组中都是非负元素,那么需要取得三个数就是数组中三个最大的数,
  2. 如果数组出现了一个负数,则取法与第一种情况相同
  3. 如果数组中有两个以上得负数和正数,则需要判断取三个最大得正数和取两个绝对值最大的负数和一个最大得正数哪种情况乘积最大
  4. 如果只有一个正数则取取两个绝对值最大得负数和一个正数
  5. 如果全为负数则取三个绝对值最小的负数(数组中三个最大的数)

综上只需要判断取两个最小的数和一个最大的数与取三个最大的数,这两种情况的乘积哪个大

public class Solution {
     
    public int maximumProduct(int[] nums) {
     
        Arrays.sort(nums);
        return Math.max(nums[0] * nums[1] * nums[nums.length - 1], nums[nums.length - 1] * nums[nums.length - 2] * nums[nums.length - 3]);
    }
}

线性扫描

上述方法只需要知道数组中两个最小值,和三个最大值因此可以使用线性扫描。

class Solution {
     
    public int maximumProduct(int[] nums) {
     
        int min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE;
        int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE;
        for (int num : nums) {
     
            if (num > max1) {
      // 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;
            }
        }
        return Math.max(min1 * min2 * max1, max1 * max2 * max3);
    }
}

你可能感兴趣的:(LeetCode,#,数学)