LeetCode -- 918. 环形子数组的最大和

 遇到环形问题一般有两种考虑方法:

    1.破环成链

    2.分为数组中间部分和数组两边部分分别考虑

本题采用第二种考虑方法,将原数组分为中间部分和两边部分分别考虑。中间部分即为子数组最大和,两边部分计总和减去中间部分最小和。

复制代码
class Solution {
public:
    int maxSubarraySumCircular(vector<int>& nums) {
        int n= nums.size();
        int sum = nums[0];
        vector<int> f(nums);
        vector<int> g(nums);

        for(int i = 1; i < n; i ++ ) {
            f[i] = max(nums[i], f[i - 1] + nums[i]);
            g[i] = min(nums[i], g[i - 1] + nums[i]);
            sum += nums[i];
        }

        int maxv = *max_element(f.begin(), f.end());
        int minv = *min_element(g.begin(), g.end());

        return max(maxv, sum - minv == 0 ? maxv: sum - minv);

    }
};
复制代码

 

posted @   深渊之巅  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· .Net程序员机会来了,微软官方新推出一个面向Windows开发者本地运行AI模型的开源工具
· 2024年终总结 : 迷茫, 尝试突破, 内耗, 释怀
· 2024个人总结
· JSON解析的这6种方案,真香!
· 开源商业化 Sealos 如何做到月入 160万
点击右上角即可分享
微信分享提示