leetcode 最大乘积子数组 中等
和子数组最大和没太大区别。
唯一的就是需要保存两个值,最大乘积和最小乘积,因为存在负数,最小乘积乘上这个负数就可能变最大乘积了.
不用滚动数组优化的代码:
class Solution { public: int maxProduct(vector<int>& nums) { // dpMin[i].first 表示不包含 i 这个数的最小乘积 // dpMin[i].second 表示包含 i 这个数的最小乘积 vector<pair<int, int>> dpMin(nums.size()); // dpMax 同理 vector<pair<int, int>> dpMax(nums.size()); for(int i = 0; i < nums.size(); ++ i) { if(i == 0){ dpMin[i].first = INT_MAX; dpMin[i].second = nums[i]; dpMax[i].first = INT_MIN; dpMax[i].second = nums[i]; } else { dpMin[i].first = min(dpMin[i - 1].first, dpMin[i - 1].second); dpMin[i].second = min(dpMin[i - 1].second * nums[i], nums[i]); dpMin[i].second = min(dpMin[i].second, dpMax[i - 1].second * nums[i]); dpMax[i].first = max(dpMax[i - 1].first, dpMax[i - 1].second); dpMax[i].second = max(dpMax[i - 1].second * nums[i], nums[i]); dpMax[i].second = max(dpMax[i].second, dpMin[i - 1].second * nums[i]); } } return max(dpMax.back().first, dpMax.back().second); } };