需求:
找出一个序列中乘积最大的连续子序列(至少包含一个数)。
比如, 序列 [2,3,-2,4]
中乘积最大的子序列为 [2,3]
,其乘积为6
。
分析:
1、O(n^2)
暴力求解,变量数组每个元素,求其所有的子序列的乘积,并更新乘积最大值。
2、O(n)
采用动态规划思想,类似于求最大和子序列,但是乘法和加法不同,确定某个元素为结尾的子序列最大和时,需要看其前一个元素为结尾子序列最大和是否是正数,而对于乘法,需要考虑该元素、该元素乘以前一个元素为结尾的子序列最大最小值的最大值。为了表述清楚,描述如下:
原始数组是int nums[],对于数组nums的每个元素,对应两个变量,posmax代表以nums[i]为结尾的子序列乘积的最大值,negmax代表以nums[i]为结尾的子序列乘积的最小值,而最大乘积是二者的最大值。所以初始时,posmax=nums[0],negmin=nums[0],max=nums[0]。遍历数组元素nums[i],更新posmax=max{nums[i], nums[i]*posmax(nums[i-1]对应的), nums[i]*negmin(