美文网首页消零燕归来算法刷题
LeetCode刷题-三个数的最大乘积

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

作者: 小鲨鱼FF | 来源:发表于2021-07-07 07:27 被阅读0次

    前言说明

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

    题目连接

    三个数的最大乘积

    题目内容

    给你一个整型数组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刷题-三个数的最大乘积

        本文链接:https://www.haomeiwen.com/subject/sscgultx.html