乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4] 输出: 6 解释: 子数组 [2,3] 有最大乘积 6。 示例 2:
输入: [-2,0,-1] 输出: 0 解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
我不太会动态规划,之前遇到过类似的问题,既有正数也有负数,如何求最大的值,问了身边的人:同时保存两个值,一个最大值,一个最小值。列出状态转移方程,每一步记录从0到当前位置i的最小值与最大值。最后选择一个最大的值。
class Solution { public: int maxProduct(vector<int>& nums) { int n = nums.size(); int a[n + 1][2]; a[0][0] = a[0][1] = nums[0]; int m = nums[0]; for (int i = 1; i < n; i ++ ) { a[i][0] = max(nums[i], max(a[i - 1][0] * nums[i], a[i - 1][1] * nums[i])); a[i][1] = min(nums[i], min(a[i - 1][0] * nums[i], a[i - 1][1] * nums[i])); m = max(max(a[i][0], a[i][1]), m); } return m; } };
