53. 最大子序和(Leetcode刷题 最大前缀和\动态规划)
题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
输入:nums = [1]
输出:1
输入:nums = [0]
输出:0
输入:nums = [-1]
输出:-1
输入:nums = [-100000]
输出:-100000
解题思路
贪心算法
寻找中间数组的最大长度,看到最大,其实就有了动态规划的意思。
观察一下,可以发现,连续子数组的第一个数字一定是大于0的,最后一位也一定是大于0 的。
我们可以用最长前缀匹配的方法来做这个题目。
sum来表示滑动数组的和,res表示现在发现的最大的数组的和。
对于sum来说,如果sum小于0的话,那就重新选择nums[i]
如果sum大于0的话,那就继续加nums[i],再与res比较。
解题代码
class Solution{
public:
int maxSubArray(vector<int>&nums){
int res=INT_MIN;
int sum=0,length=nums.size();
for(int i=0;i<length;i++){
if(sum>0) sum+=nums[i];
else sum=nums[i];
res=max(sum,res);
}
return res;
}
};