欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > C++算法第十五天

C++算法第十五天

2025/9/19 17:02:48 来源:https://blog.csdn.net/2302_80418176/article/details/144758774  浏览:    关键词:C++算法第十五天

复习周终于结束了,这也是复习周结束后的第一篇文章,请各位小伙伴们细细品尝,废话不多说,我们开始今天的讲解。

第一题

题目链接

918. 环形子数组的最大和 - 力扣(LeetCode)

题目解析

代码原理

注意:g[i - 1]与先前讲的dp[i - 1]是一样的,即到i-1位置的最小子数组和

代码编写

class Solution {

public:

    int maxSubarraySumCircular(vector<int>& nums) {

        int n = nums.size();

        //建表

        vector<int> f(n + 1);

        auto g = f;

        //初始化

        f[0] = -0x3f3f3f3f,g[0] = 0x3f3f3f3f;

        //填表

        int sum = 0, fmax = -0x3f3f3f3f,gmin = 0x3f3f3f3f;

        for(int i = 1; i <= n; i++)

        {

           f[i] = max(f[i - 1] + nums[i - 1], nums[i - 1]);

           fmax = max(fmax, f[i]);

           g[i] = min(g[i - 1] + nums[i - 1], nums[i - 1]);

           gmin = min(g[i], gmin);

           sum += nums[i - 1];

        }

        return sum == gmin? fmax:max(fmax,sum - gmin);

    }

};

第二题

题目链接

152. 乘积最大子数组 - 力扣(LeetCode)

题目解析

代码原理

代码编写

class Solution {

public:

    int maxProduct(vector<int>& nums) {

        int n = nums.size();

        //建表

        vector<int>f(n + 1);

        auto g = f;

        //初始化

        f[0] = g[0] = 1;

        int ret = -0x3f3f3f3f;

        //填表

        for(int i = 1; i <= n; i++)

        {

            f[i] = max(max(nums[i - 1], nums[i - 1] * f[i - 1]), nums[i - 1] * g[i - 1]);

            g[i] = min(min(nums[i - 1], nums[i - 1] * f[i - 1]), nums[i - 1] * g[i - 1]);

            ret = max(f[i], ret);

        }

        return ret;

    }

};

第三题

题目链接

1567. 乘积为正数的最长子数组长度 - 力扣(LeetCode)

题目解析

代码原理

代码编写

class Solution {

public:

    int getMaxLen(vector<int>& nums) {

        int n = nums.size();

        //建表

        vector<int> f(n + 1);

        auto g = f;

        //初始化

        g[0] = f[0] = 0;

        int res = -0x3f3f3f3f;

        for(int i = 1; i <= n; i++)

        {

            if(nums[i - 1] > 0)

            {

                f[i] = f[i - 1] + 1;

                g[i] = g[i - 1] == 0? 0: g[i - 1] + 1;

            }

            else if(nums[i - 1] < 0)

            {

                g[i] = f[i - 1] + 1;

                f[i] = g[i - 1] == 0? 0: g[i - 1] + 1;

            }

           res = max(res, f[i]);

        }

        return res;

    }

};

那么本题的难点就是最后的那一部分,博主在这里也是出了点小事故,那么这题看似复杂其实自己画图+思考后也可以理解。

那么这题有没有其他方法呢?当然是有的,那么预知后事如何,且听博主下回分析。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词