Algo: maxSubArray vs. maxProduct

    这两个问题类似,都可利用动态规划思想求解。

 

一、最大连续子序列和

https://leetcode.com/problems/maximum-subarray/description/

https://www.geeksforgeeks.org/largest-sum-contiguous-subarray/

 

The core ideas are the same:

        currentMax = max(nums[i], some_operation(currentMax, nums[i])).

For each element, we have 2 options: put it inside a consecutive subarray, or start a new subarray with it.

 

#include <vector>

int maxSubArray(std::vector<int>& nums)
{
    if (nums.empty())
    {
        return 0;
    }
        
    int currMax = nums[0];
    int maxResult = nums[0];
        
    int size = (int)nums.size();
    for (int i = 1; i < size; ++i)
    {
        currMax = std::max(nums[i], currMax + nums[i]);
        maxResult = std::max(maxResult, currMax);
    }
        
    return maxResult;
}

 

二、最大连续子序列积

https://stackoverflow.com/questions/25590930/maximum-product-subarray

https://leetcode.com/problems/maximum-product-subarray/description/

https://www.geeksforgeeks.org/maximum-product-subarray/

https://www.geeksforgeeks.org/maximum-product-subarray-added-negative-product-case/

https://www.geeksforgeeks.org/maximum-product-subarray-set-2-using-two-traversals/

 

#include <vector>

int maxProduct(std::vector<int>& nums)
{
    if (nums.empty())
    {
        return 0;
    }
        
    int size = (int)nums.size();
        
    int currMax = nums[0];
    int currMin = nums[0];
    int maxResult = nums[0];
 
    for (int i = 1; i < size; ++i)
    {
        int t_currMax = currMax * nums[i];
        int t_currMin = currMin * nums[i];
            
        currMax = max(nums[i], max(t_currMax, t_currMin));
        currMin = min(nums[i], min(t_currMax, t_currMin));
        maxResult = max(maxResult, currMax);
    }
        
    return maxResult;
}

 

posted @ 2018-03-20 22:30  朔方  阅读(231)  评论(0编辑  收藏  举报