53.Maximum Subarray

53.Maximum Subarray

class Solution {
public:
    struct SubArray{
        int low;
        int high;
        int sum;
        SubArray(int _low, int _high, int _sum):low(_low), high(_high), sum(_sum){}
    };

    int maxSubArray(vector<int>& nums) {
        SubArray result = findMaxSubarray(nums, 0, nums.size()-1);

        return result.sum;
    }

    SubArray findMaxCrossingSubarray(vector<int>& input, int low, int mid, int high){
        int leftSum = INT_MIN, rightSum = INT_MIN;
        int sum = 0, left = mid, right = mid;
        for (int i = mid; i >= low; --i) {
            sum = sum + input[i];
            if(sum > leftSum){
                leftSum = sum;
                left = i;
            }
        }

        sum = 0;
        for (int j = mid + 1; j <= high; ++j) {
            sum = sum + input[j];
            if(sum > rightSum){
                rightSum = sum;
                right = j;
            }
        }

        return SubArray(left, right, leftSum + rightSum);
    }

    SubArray findMaxSubarray(vector<int> &input, int low, int high){
        int mid = 0;
        if(low == high)
            return SubArray(low, high, input[low]);
        else{
            mid = (low + high) / 2;
            SubArray subArrayLeft = findMaxSubarray(input, low, mid);
            SubArray subArrayRight = findMaxSubarray(input, mid + 1, high);
            SubArray subArrayCross = findMaxCrossingSubarray(input, low, mid, high);

            if(subArrayLeft.sum >= subArrayRight.sum && subArrayLeft.sum >= subArrayCross.sum)
                return subArrayLeft;
            else if(subArrayRight.sum >= subArrayLeft.sum && subArrayRight.sum >= subArrayCross.sum)
                return subArrayRight;
            else
                return subArrayCross;
        }
    }
};
发布了5 篇原创文章 · 获赞 1 · 访问量 410
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览