数组与矩阵---数组中子数组的最大累乘积
2017-09-19 09:14
218 查看
【题目】
给定一个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]结尾的最大累乘积只可能来自以下三种情况:
可能是max * arr[i]
可能是min * arr[i],因为数组中可能包含负数,负负得正
可能是arr[i],因为以arr[i-1]结尾的最大乘积可能小于1
这三种可能的值中最大的那个就作为以 i 位置结尾的最大累乘积,最小的作为最小累乘积,继续遍历下一个位置。
下面是使用python3.5实现的代码。
给定一个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]结尾的最大累乘积只可能来自以下三种情况:
可能是max * arr[i]
可能是min * arr[i],因为数组中可能包含负数,负负得正
可能是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
相关文章推荐
- 数组中子序列最大和算法
- 20.找出矩阵中最大的数存入数组中
- 【算法题】求数组中子数组的最大乘积
- 剑指offer 机器人的运动范围 矩阵中的路径 滑动窗口最大值 次数超过一半的数 连续子数组的最大和
- 算法导论笔记:04最大子数组矩阵乘法以及递归式求解
- 求解数组中子数组连续元素的之和的最大值
- 找出一个数组中子数组和的最大值
- 数组中子数组等于k的最大长度
- Task 4.4二维环形数组求最大子矩阵之和
- 数组中子数组和的最大值
- 求整数数组中子数组最大的和值!
- 求二维数组组成的矩阵中子矩阵的最大值
- 求数组中子数组的最大和
- 数组中子数组之和最大值(首尾相接)
- 找出一个个既有正数又有负数的数组中子数组的和的最大值
- 求数组中子数组的最大和
- 经典面试题:求数组的最大子序列和;实现函数 :判断一个自负喜欢是否是另一个字符串旋转所得;杨氏矩阵中查找一个数。
- 数组中子数组的最大累乘积
- 编程之美--求数组中子数组之和的最大值
- 求数组矩阵的最大子数组之和