分治与归并

归并算法: 递归+合并,在递归的途中进行分治。递归会把区间越分越小,此时就可以进行分治操作。

可以使用全局变量进行分治操作。

可以在函数中进行分治操作,在递归树中实现pushup和pushdown,记性父节点与子节点的关系计算。

 

 

class Solution {
public:

    struct Node {
        int lsum, rsum, isum, msum;
    };

    Node pushup(Node &a, Node &b) {
        int isum = a.isum + b.isum;
        int lsum = max(a.lsum, a.isum + b.lsum);
        int rsum = max(b.rsum, a.rsum + b.isum);
        int msum = max(max(a.msum, b.msum), a.rsum + b.lsum);
        return {lsum, rsum, isum, msum};
    }

    Node get(vector<int> &a, int l, int r) {
        if(l == r) {
            return Node{a[l], a[l], a[l], a[l]};
        }
        int mid = l + r >> 1;
        auto sl = get(a, l, mid), sr = get(a, mid + 1, r);
        return pushup(sl, sr);
    }

    int maxSubArray(vector<int>& nums) {
        return get(nums, 0, nums.size() - 1).msum;
    }
};

 

posted @ 2023-11-20 20:22  深渊之巅  阅读(16)  评论(0编辑  收藏  举报