1.题目描述
输入一个数字序列,找出拥有最大积的连续子序列。
2.解题思路
这道题在LeetCode上归类于动态规划,所以我们可以用动态规划的思路去解决它。
首先是找出子问题:我们可以把找到一个拥有最大积的以下标为i的元素结尾的连续子序列的问题等同与找到下标为i的元素、拥有最大积的以下标为i-1的元素结尾的连续子序列与下标为i的元素的积中更大的那一个。如果数字序列为a,下标为0到n,而以元素a[i]结尾的最大积连续子序列为C(i),那么
C(i) = max(C(i - 1) * a(i), a(i))
所以,代码如下:
class Solution {
public:
int maxProduct(vector<int>& nums) {
int size = nums.size();
int max_result = nums.at(0);
int max_product = max_result;
int min_product = max_result;
// 因为是记录积,所以应该把以nums[i - 1]结尾的最大积和最小积都记录下来,
// 方便求以nums[i]结尾的最大积
for (int i = 1; i < size; ++i) {
int num = nums.at(i);
if (num > 0) {
max_product = max(max_product * num, num);
min_product = min(min_product * num, num);
}
else {
int temp = max_product;
max_product = max(min_product * num, num);
min_product = min(temp * num, num);
}
if (max_product > max_result)
max_result = max_product;
}
return max_result;
}
};