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;
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值