最大子序列和

https://leetcode-cn.com/problems/maximum-subarray/

 

53. 最大子序和

难度简单

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

 

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [0]
输出:0

示例 4:

输入:nums = [-1]
输出:-1

示例 5:

输入:nums = [-100000]
输出:-100000


class Solution {
public:
    /*
    问题思路,1.如何将原问题划分子问题。 取中间点划分
    2.最大序列和在左,在右,或者中间。
    3.返回子问题的解

    代码设计思路,1.因为需要比较左右最大值,需要返回值
    2.左段index从大往小取,右段index从小往大取,中间答案为两者之和。 左右段使用递归出口,l==r
    3.返回比较最值
    4.mid = (l+r)/2 ? (l+r+1)/2。这里可以任意选,只要左右两端区间覆盖整个区间即可。不过当size=2的时候,r=1,所以本code使用mid = (l+r)/2。
    */
    int dfs(vector<int>& nums, int l, int r){
        if(l==r)
            return nums[l];
        int mid = (l+r)/2;
        int l_max = dfs(nums, l, mid);
        int r_max = dfs(nums, mid+1, r);
        int max_ = max(l_max, r_max);
        int l_sum = 0, r_sum = 0;
        int l_sum_max=INT_MIN, r_sum_max=INT_MIN;
        for(int i= mid; i>=0; i--){
            l_sum = l_sum+nums[i];
            l_sum_max = max(l_sum_max, l_sum);
        }
        for(int i=mid+1; i<=r; i++){
            r_sum = r_sum+nums[i];
            r_sum_max = max(r_sum_max, r_sum);
        }

        max_ = max(max_, l_sum_max+r_sum_max);

        return max_;
    }

    int maxSubArray(vector<int>& nums) {
        int ans = dfs(nums, 0, nums.size()-1);
        return ans;
    }
};

 

posted @ 2021-06-24 22:02  会飞的雅蠛蝶  阅读(30)  评论(0编辑  收藏  举报