题目描述
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
示例1
输入
3 4 1 2
输出
24
思路:
这道题可以从结果入手,分析数组的构成情况。
当结果为正时,说明数组可能有至少 三个正数/一个正数两个负数,乘积最大只有两种情况:
- 三个最大正数
- 一个最大正数和两个最小负数
当结果为负时,除非数组只有三个数,否则说明没有正数,乘积最大只有一种情况:
三个最大负数
当结果为0时,说明取数必须取到0,则其他数最多存在两个正数且最多一个负数/没有正数且负数随意。
分析发现,无论以上哪种情况,取最大的三个数,或者最小的两个数和最大的一个数算乘积,都能涵盖。
代码:
a = int(input())
num = [int(n) for n in input().split()] #python的数组输入,编程题常用
num.sort(reverse = True) #内建函数sort()对列表排序,reverse = True降序,默认为升序
a=num[0]*num[1]*num[2]
b=num[-1]*num[-2]*num[0]
if a>=b:
print(a)
else:
print(b)
注:
测试发现,牛客网的测试样例有缺陷,示例中不包含输入的数组长度,但测试样例有两行:第一行是数组大小 n,第二行是无序整数数组 A[n],因此我们需要用一个变量a来捕获第一行的数据