Leetcode53. 最大子序和(最大连续子数组和)

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

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

示例:

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

如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。

动态规划解法:

  假设我们已经知道 [ 0 , j ] 的子问题的最大连续子数组,现在我们来考虑 [ 0, j+1] 的最大连续子数组。显然,可以得到如下的性质

[ 0, j+1] 的最大连续子数组 = max(  [ 0, j ]中的最大连续子数组  ,[ i, j+1] 的最大连续子数组 ),其中  0<= i <= j+1 。

  但是直接做的话时间复杂度还是O(n2),因为 i 和 j 两层循环。

  实际上,对于 [ i, j+1] 的最大连续子数组  可以通过 不断地维护 后缀最大值 来实现,从而使时间复杂度降为O(n)。

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int ans=nums[0];
        int left_pos=0,right_pos=0;
        int pre_sum=ans,pre_left=0;
for(int i=1;i<nums.size();i++){ //状态转移方程dp pre_sum=max(pre_sum+nums[i],nums[i]);//维护后缀最大值 ans=max(ans,pre_sum);//上一个子问题0...j 与 i..j+1,取最大 } return ans; } };

猜你喜欢

转载自www.cnblogs.com/reflecter/p/12032693.html