题目描述
给定一个整数数组 nums
,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
解题思路
利用动态规划思想,因为两个负数相乘会变成正数,所以对于每个位置要记录当前子序列的乘积最大值和最小值,这样状态转移方程为:
maxNum = max(maxNums[i - 1] * nums[i], minNums[i - 1] * nums[i], nums[i])
minNum = min(maxNums[i - 1] * nums[i], minNums[i - 1] * nums[i], nums[i])
代码
1 class Solution { 2 public: 3 int maxProduct(vector<int>& nums) { 4 vector<int> maxNums(nums), minNums(nums); 5 int res = nums[0]; 6 for(int i = 1; i < nums.size(); i++){ 7 maxNums[i] = max(maxNums[i - 1] * nums[i] < minNums[i - 1] * nums[i] ? minNums[i - 1] * nums[i] : maxNums[i - 1] * nums[i], nums[i]); 8 minNums[i] = min(maxNums[i - 1] * nums[i] > minNums[i - 1] * nums[i] ? minNums[i - 1] * nums[i] : maxNums[i - 1] * nums[i], nums[i]); 9 if(res < maxNums[i]) 10 res = maxNums[i]; 11 } 12 return res; 13 } 14 };