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

 

转载于:https://www.cnblogs.com/noryes/p/8613271.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值