最大乘积

'''
题目描述
给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)
输入描述:
输入共2行,第一行包括一个整数n,表示数组长度
第二行为n个以空格隔开的整数,分别为A1,A2, … ,An
'''


import sys

n = int(input().strip().split()[0])
numbers = input().strip().split()
numbers = [int(x) for x in numbers]

max_ = [float("-inf"), float("-inf"), float("-inf")]
min_ = [float("inf"), float('inf')]

for num in numbers:
    if num >= 0 and num > min(max_):
        max_[max_.index(min(max_))] = num
    elif num < 0 and num < max(min_):
        min_[min_.index(max(min_))] = num

a = max_[0] * max_[1] * max_[2]
b = max(max_) * min_[0] * min_[1]

if abs(a) == float('inf'):
    a = 0
if abs(b) == float('inf'):
    b = 0

if a >= b:
    sys.stdout.write(str(a))
else:
    sys.stdout.write(str(b))

解题思路:先分析,要求三个数(有正有负有0)乘积最大,那肯定尽可能让最后的乘积是正的,思路就来了,即三个数要么是 + + +, 要么是 + - -, 即三个最大正数或者一个最大正数和两个最小负数,其他情况都是负数和0 了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值