LeetCode刷题-三个数的最大乘积

前言说明

算法学习,日常刷题记录。

题目连接

三个数的最大乘积

题目内容

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

示例1:

输入:nums = [1,2,3]

输出:6

示例2:

输入:nums = [1,2,3,4]

输出:24

示例3:

输入:nums = [-1,-2,-3]

输出:-6

提示:

3 <= nums.length <= 10^4

-1000 <= nums[i] <= 1000

分析过程

分三种情况分析。

第一种情况,全部是正数,最大乘积 = 第一最大值 * 第二最大值 * 第三最大值。

第二种情况,全部是负数,最大乘积 = 第一最大值 * 第二最大值 * 第三最大值。

第三种情况,有正数也有负数,最大乘积是以下两种情况中的一种,取最大值。

1、最大乘积 = 第一最大值 * 第二最大值 * 第三最大值,取最大的是三个数,这种情况很好理解,这里就不细说了。

2、最大乘积 = 第一最小值 * 第二最小值 * 第一最大值,这种情况是,绝对值中最小值那一侧比最大值那一侧要大,所以取最小值那一侧的两个最小值,因为两个负数相乘为正数,所以只取第一最小值和第二最小值,再乘以第一最大值。

所以首先对数组nums进行排序,获取第一最小值、第二最小值、第一最大值、第二最大值、第三最大值,计算以上两种情况的乘积,取最大值就是答案。

解答代码

class Solution {
    public int maximumProduct(int[] nums) {
        // 对数组nums排序
        Arrays.sort(nums);

        // 取第一最小值
        int min1 = nums[0];
        // 取第二最小值
        int min2 = nums[1];

        // 取第一最大值
        int max1 = nums[nums.length - 1];
        // 取第二最大值
        int max2 = nums[nums.length - 2];
        // 取第三最大值
        int max3 = nums[nums.length - 3];

        // 若全部是正数,最大乘积=第一最大值*第二最大值*第三最大值
        // 若全部是负数,最大乘积=第一最大值*第二最大值*第三最大值
        // 若有正数也有负数,最大乘积是以下两种情况中的一种,取最大值

        // 第一种情况,第一最大值*第二最大值*第三最大值
        int product1 = max1 * max2 * max3;
        // 第二种情况,第一最小值*第二最小值*第一最大值,因为如果数组中有正数也有负数时,两个负数相乘得到正数
        int product2 = min1 * min2 * max1;

        // 取两种情况中的最大值
        return Math.max(product1, product2);
    }
}

提交结果

执行用时12ms,时间击败70.88%的用户,内存消耗39.9MB,空间击败37.04%的用户。

运行结果

原文链接

原文链接:三个数的最大乘积

你可能感兴趣的:(LeetCode刷题-三个数的最大乘积)