最大k乘积的时间复杂度_最大乘积

题目描述

给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)

输入描述:

无序整数数组A[n]

输出描述:

满足条件的最大乘积

示例1

输入
3 4 1 2
输出
24

思路:

这道题可以从结果入手,分析数组的构成情况。

当结果为正时,说明数组可能有至少 三个正数/一个正数两个负数,乘积最大只有两种情况:

  1. 三个最大正数
  2. 一个最大正数和两个最小负数

当结果为负时,除非数组只有三个数,否则说明没有正数,乘积最大只有一种情况:

三个最大负数

当结果为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来捕获第一行的数据

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值