数组与矩阵---数组中子数组的最大累乘积

来源:互联网 发布:485接口数据交换 编辑:程序博客网 时间:2024/05/19 05:30

【题目】

  给定一个double类型的数组arr,其中的元素可正、可负、可0,返回子数组累乘的最大乘积。例如,arr = [-2.5, 4, 0, 3, 0.5, 8, -1],子数组[3, 0.5, 8]累乘可以获得最大的乘积12,所以返回12.

【基本思路】

  本题可以做到时间复杂度O(N)、空间复杂度O(1).

  大致思路是,遍历一遍数组,求出以每一个元素结尾的子数组的最大累乘积。如何快速的求出以 i 位置结尾的子数组的最大累积呢?假设以arr[i-1]结尾的最小乘积是min,最大乘积是max。那么,以arr[i]结尾的最大累乘积只可能来自以下三种情况:

  1. 可能是max * arr[i]

  2. 可能是min * arr[i],因为数组中可能包含负数,负负得正

  3. 可能是arr[i],因为以arr[i-1]结尾的最大乘积可能小于1

这三种可能的值中最大的那个就作为以 i 位置结尾的最大累乘积,最小的作为最小累乘积,继续遍历下一个位置。

下面是使用python3.5实现的代码。

def maxProduct(arr):    if arr == None or len(arr) == 0:        return 0    maxPro = arr[0]    minPro = arr[0]    res = 0    for i in range(1, len(arr)):        maxPro = maxPro * arr[i]        minPro = minPro * arr[i]        maxPro = max(maxPro, minPro, arr[i])        minPro = min(minPro, maxPro, arr[i])        res = max(res, maxPro)    return res
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 贴双眼皮贴眼睛肿了怎么办 送孩子赴澳洲家长怎么办签证? 开指过程中发烧怎么办 大水口热流道有料花怎么办 奶奶疼外孙胜过孙子怎么办 吃了有病的鸡怎么办 博士真毕不了业怎么办 35岁博士毕不了业怎么办 跨校考研失败了怎么办 开发商把网签房卖给我该怎么办 cad中命令行没了怎么办 平板玩游戏很卡怎么办 卵巢包块20厘米怎么办 耳机的橡胶破了怎么办 脚被树枝扎破了怎么办 脚被木头扎肿了怎么办 手表字面脚断了怎么办 捡到苹果电脑怎么办才能自己用 耳机泡在水里了怎么办 蓝牙耳机泡水了怎么办 拖欠农民工工资劳动局不管怎么办 怎么办假的残疾军人证 外地人到北京就业怎么办五险 巴基斯坦留学生护照丢了怎么办 不敢上梯子太丢人怎么办 家人信了全能神怎么办 头皮上长淋巴炎怎么办? 鱼缸里的鱼相互咬怎么办? 火车凌晨4点到站怎么办 金立手机拍不了照怎么办 手术拆线后切口不平怎么办 乳牙透明冠掉了怎么办 配眼镜度数低了怎么办 眼睛高度近视怎么办才能恢复 猎人荒野的呼唤打中一枪后怎么办 凯恩帝数控超程报警怎么办 凯恩帝数控车床x向超程怎么办 别人问你借账号怎么办 微信成夜间模式怎么办 网络电视突然黑屏了怎么办 1adac连接线坏了怎么办