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;
    }
};

 

posted @ 2018-08-26 22:09  約束の空  阅读(82)  评论(0)    收藏  举报