加载中...
628-三个数的最大乘积(Maximum Product of Three Numbers)
发表于:2021-12-03 | 分类: 简单
字数统计: 156 | 阅读时长: 1分钟 | 阅读量:

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

英文原文

Given an integer array nums, find three numbers whose product is maximum and return the maximum product.

 

Example 1:

Input: nums = [1,2,3]
Output: 6

Example 2:

Input: nums = [1,2,3,4]
Output: 24

Example 3:

Input: nums = [-1,-2,-3]
Output: -6

 

Constraints:

  • 3 <= nums.length <= 104
  • -1000 <= nums[i] <= 1000

中文题目

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

  • 3 <= nums.length <= 104
  • -1000 <= nums[i] <= 1000

通过代码

高赞题解

解题思路

排序法:数组可以分为三种情况,第一是都为正数,第二是都为负数,第三是有正有负(分为(1)只有一个负数(2)有两个及以上的负数)
都为正数:乘积最大值为排序数组最后三个数相乘
都为负数:乘积最大值为排序数组最后三个数相乘
有正有负:(1)乘积最大值为排序数组最后三个数相乘
(2)乘积最大值为排序数组前两个负数与数组最后一个正数相乘
整理一下上面的四种情况:可以归纳成取max(排序数组最后三个数相乘,排序数组前两个负数与数组最后一个正数相乘)
不排序方法:通过上面对排序法的分析,我们可以看出,实际上我们只要找到数组的第一大的值,第二大的值,第三大的值,第一小的值和第 二小的值即可。所以我们只需要遍历一边数组,即可找到这些值(具体实现看代码注释)!

代码

class Solution:
    def maximumProduct(self, nums: List[int]) -> int:
        """排序方法,时间复杂度O(nlog(n))"""
        # nums.sort()
        # return max(nums[-1] * nums[-2] * nums[-3], nums[-1] * nums[0] * nums[1])

        """遍历一遍数组,不使用排序,时间复杂度O(n)"""
        max1 = -float('inf')       # 第一大的值
        max2 = -float('inf')       # 第二大的值
        max3 = -float('inf')       # 第三大的值
        min1 = float('inf')        # 第一小的值
        min2 = float('inf')        # 第二小的值

        for num in nums:
            if num > max1:         # 啥?你比第一大的值还大??那好吧,你去做老大
                max3 = max2        # 原老二委屈一下你,去做老三吧,难受...
                max2 = max1        # 原老大委屈一下你,去做老二吧,很难受...
                max1 = num         # 大哥快请上座!!!
            elif num > max2:       # 嗯?你比第二大的值大啊??那行吧,老二给你做,别碰老大啊,他脾气不好...
                max3 = max2        # 原老二委屈一下你,去做老三吧,难受...
                max2 = num         # 二哥请上座!!
            elif num > max3:       # 别舞舞喳喳的,不就比第三大的值大么??去去去,那个位置给你了...
                max3 = num         # 三哥上座!
            
            if num < min1:         # 啊?你比第一小的值还小,哈哈哈,笑死我了,来来来,快去!
                min2 = min1        # 原第一小,恭喜你,终于找到比你小的了,你现在是第二小!
                min1 = num         # 老实呆着,你现在是最小的了!!!
            elif num < min2:       # 哦?你比第二小的值小?比最小的还大,嗯..那你去做第二小
                min2 = num         # 来吧,你现在是第二小,原第二小解脱了!
            
        return max(max1 * max2 * max3, max1 * min1 * min2)

统计信息

通过次数 提交次数 AC比率
83205 158724 52.4%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言

相似题目

题目 难度
乘积最大子数组 中等
上一篇:
627-变更性别(Swap Salary)
下一篇:
629-K个逆序对数组(K Inverse Pairs Array)
本文目录
本文目录