LeetCode 152. Maximum Product Subarray
这道题是 53. Maximum Subarray 的变形。由于负数的存在,max_ending_here[i] 可能是以下三种情况。
max_ending_here[i] * nums[i] nums[i]>0
min_ending_here[i] * nums[i] nums[i]<0
nums[i]
DP 递推公式:
dp[i] = max{dp[i-1], f[i]}
f[i] = max{max[i-1]*nums[i], min[i-1]*nums[i], nums[i]}
class Solution { public: int maxProduct(vector<int>& nums) { // dp[i] = max{dp[i-1], f[i]} // f[i] = max{max[i-1]*nums[i], min[i-1]*nums[i], nums[i]} int max_so_far=nums[0]; int max_ending_here=nums[0]; int min_ending_here=nums[0]; for (int i=1;i<nums.size();++i){ if (nums[i]<0) swap(max_ending_here, min_ending_here); max_ending_here = max(nums[i], max_ending_here*nums[i]); min_ending_here = min(nums[i], min_ending_here*nums[i]); max_so_far = max( max_so_far, max_ending_here ); } return max_so_far; } };

浙公网安备 33010602011771号