152. 乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
测试用例的答案是一个 32-位 整数。
子数组 是数组的连续子序列。
解析
- 采用动态规划的思想,maxp[i] 表示包含num[i]的乘积最大值,minp[i]表示包含num[i]的乘积最小值,由于元素中含有负数因此最大最小都要考虑。
- 然后由于后一个元素值只和前一个元素值有关,因此可以使用动态数组优化空间。
code
class Solution {
public:
int maxProduct(vector<int>& nums) {
int n=nums.size();
int maxp = nums[0];
int minp = nums[0];
int ans = nums[0];
for(int i=1;i<n;i++){
int tmp = maxp;
maxp = max(max(maxp*nums[i],minp*nums[i]),nums[i]);
minp = min(min(tmp*nums[i],minp*nums[i]),nums[i]);
ans = max(maxp,ans);
}
return ans;
}
};