Maximum Product Subarray
Find the contiguous subarray within an array (containing at least one number) which has the largest product.
For example, given the array [2,3,-2,4]
,
the contiguous subarray [2,3]
has the largest product = 6
.
解題思路:乘法與加法最大差別在於,當前元素的符號具有全局性的作用。
如果當前元素為負,那么連乘到上個元素的最大乘積,再乘以當前元素,就變成負數,甚至可能成為最小乘積。
同樣,連乘到上個元素的最小乘積如為負,再乘以當前元素,就變成正數,甚至可能成為最大乘積。
因此使用動態規划的方法:
記maxLast/minLast為連乘到上個元素的最大/小乘積
記maxCur/minCur為連乘到當前元素的最大/小乘積
記maxAll為全局最大乘積
class Solution { public: int maxProduct(vector<int>& nums) { if(nums.empty()) return 0; if(nums.size() == 1) return nums[0]; int maxAll = nums[0]; //global maximum int maxLast = nums[0]; //maximum including last element int maxCur; //maximum including current element int minLast = nums[0]; //minimum including current element int minCur; //minimum including last element for(int i = 1; i < nums.size(); i ++) { maxCur = max(nums[i], max(maxLast*nums[i], minLast*nums[i])); minCur = min(nums[i], min(maxLast*nums[i], minLast*nums[i])); maxLast = maxCur; minLast = minCur; maxAll = max(maxAll, maxCur); } return maxAll; } };