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
.Show Similar Problems
Attention: product means the result of multiplication, not the product item. (不是指商品的营业额,利润什么的)
dynamic programming O(n) in time and space.
dpp[i] stores the biggest positive product containing nums[i]
dpn[i] stores the smallest negative product containing nums[i]
//Will the result exceeds the range of 32 bits integer? //Product !!! 2 times 3, 2 * 3 the product is 6. //What should I return if nums is empty? //deal 0 carefully! class Solution { public: int maxProduct(vector<int>& nums) { if(nums.size() == 0) return 0; int dpp[nums.size()]; int dpn[nums.size()]; int maxRe = nums[0]; for(int i = 0; i < nums.size(); i++){ int v = nums[i]; if(i == 0){ //init if(v < 0){ dpn[i] = v; dpp[i] = 0; } else{ dpp[i] = v; dpn[i] = 0; } } else{ dpp[i] = max(v, max(v * dpp[i - 1], v * dpn[i - 1])); dpn[i] = min(v, min(v * dpp[i - 1], v * dpn[i - 1])); maxRe = max(dpp[i], maxRe); } } return maxRe; } };
O(n) in time, O(1) in space solution.
Just simply replace dpp[i] with newDpp, replace dpp[i – 1] with oldDpp
replace dpn[i] with newDpn, replace dpn[i – 1] with oldDpn.
//Will the result exceeds the range of 32 bits integer? //Product !!! 2 times 3, 2 * 3 the product is 6. //What should I return if nums is empty? //deal 0 carefully! class Solution { public: int maxProduct(vector<int>& nums) { if(nums.size() == 0) return 0; int newDpp, oldDpp; int newDpn, oldDpn; int maxRe = nums[0]; for(int i = 0; i < nums.size(); i++){ int v = nums[i]; if(i == 0){ //init if(v < 0){ oldDpn = v; oldDpp = 0; } else{ oldDpp = v; oldDpn = 0; } } else{ newDpp = max(v, max(v * oldDpp, v * oldDpn)); newDpn = min(v, min(v * oldDpp, v * oldDpn)); maxRe = max(newDpp, maxRe); oldDpn = newDpn; oldDpp = newDpp; } } return maxRe; } };