剑指offer刷题之——动态规划

动态规划

  • 1.连续数组的最大和

1.连续数组的最大和

题目描述:
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)。

思路:

典型的动态规划。
dp[n]代表以当前元素为截止点的连续子序列的最大和,如果dp[n-1]>0,dp[n]=dp[n]+dp[n-1],因为当前数字加上一个正数一定会变大;如果dp[n-1]<0,dp[n]不变,因为当前数字加上一个负数一定会变小。使用一个变量max记录最大的dp值返回即可。

代码:

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        int res=array[0]; //所有子数组的和的最大值 
        int max=array[0]; //以array[i]为末尾元素的子数组的和的最大值,子数组的元素的相对位置不变 
        for(int i=1;i<array.size();i++)
        {
            max=(max+array[i]>array[i])?max+array[i]:array[i];
            res=(max > res)?max:res;
        }
        return res;
    }
};

你可能感兴趣的:(剑指offer)