628. 三个数的最大乘积

140 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

一、题目描述:

628. 三个数的最大乘积 - 力扣(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

二、思路分析:

首先先把数组排序,然后遍历数组,将负数的个数记录起来,如果负数个数大于2,则把最前面的两个负数还有数组的最后一位相乘,然后跟数组最后三位相乘的数比较,取最大值. 如果负数个数小于2,则直接取最后三位的乘积

三、AC 代码:

class Solution {
    public int maximumProduct(int[] nums) {
        int l=nums.length;
        int count=0;
        Arrays.sort(nums);
        for(int i=0;i<nums.length;i++){
            if(nums[i]<0) count++;
            if(nums[i]>0) break;
        }
        if(count>=2) return Math.max(nums[l-1]*nums[l-2]*nums[l-3],nums[0]*nums[1]*nums[l-1]);
        else return nums[l-1]*nums[l-2]*nums[l-3];
    }
}

四、总结:

线性优化这么牛逼,思路还有待提高呀!

总体思路:
1.找出数组的最大值,第二大值,第三大值,做乘法
2.找出小于0的最小值,第二小值,
3.(三个最大值乘积)与(小于0的两个最小值和大于0最大值乘积)比较

具体思路:
1.用冒泡程序计算出数组前三个元素的最大,第二小值,第三小值,分别
复制给first, second, third,同时默认最小值全为0
2.遍历余下数组,与三个最大值和两个最小值比较,更大或更小或者处于中间时, 更新排序

范文参考:

根据数组中正数、零、负数的量情况进行讨论【有点笨的方法】 - 三个数的最大乘积 - 力扣(LeetCode) (leetcode-cn.com)

线性扫描方式解题 - 三个数的最大乘积 - 力扣(LeetCode) (leetcode-cn.com)