【leetcode】53. 最大子序和

文章目录

  • 53. 最大子序和
    • 题目描述
    • 题目分析
    • 题解代码
      • 分治算法

53. 最大子序和

题目描述

【leetcode】53. 最大子序和_第1张图片

题目分析

简单的dp问题,挨个加,遇到负数就停止,与最大值比较一下,然后以后面一个为起点继续比

后面提出了分治算法,复杂一点,时间复杂度也更高,但是这种思想可以解决这个问题的
但是我用分治算法超时。。

题解代码

分治算法

class Solution {
public:
    int max_cross_array(vector vec,int left,int mid,int right)
{
    int l_sum=0,r_sum=0;
    int l_max_sum= 0,r_max_sum=0;
    int l_start=mid-1,r_start=mid+1;
    while(l_start>=left)
    {
        l_sum+=vec[l_start];
        l_max_sum=(l_max_sum>l_sum?l_max_sum:l_sum);
        l_start--;
    }
    while(r_start<=right)
    {
        r_sum += vec[r_start];
        r_max_sum=(r_max_sum>r_sum?r_max_sum:r_sum);
        r_start++;
    }
    return l_max_sum + r_max_sum + vec[mid];
}
int max(int a,int b,int c)
{
    int max_ = a>b?a:b;
    return max_>c?max_:c;
}
    int maxSubArray_(vector  vec,int left ,int right)
{
    if(left==right)
        return vec[left];
    int mid = (left + right)>>1;
    return max(maxSubArray_(vec,left,mid),
               maxSubArray_(vec,mid+1,right),
               max_cross_array(vec,left,mid,right));
}
    int maxSubArray(vector& vec) {
     int ans = maxSubArray_(vec,0,vec.size()-1);
        return ans;
    }
};

你可能感兴趣的:(acm国际大学生程序设计竞赛)