LeetCode 152. 乘积最大子序列(Maximum Product Subarray)

题目描述

 

给定一个整数数组 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 };

 

posted @ 2018-08-02 11:37  FlyingWarrior  阅读(311)  评论(0编辑  收藏  举报