leetCode-最大子数组和
题目描述
1.动态规划算法实现
解题思路:(1)如果前一个元素值小于0,则当前元素不变;否则当前元素+=前一个元素值
算法分析:时间复杂度为O(n),空间复杂度为O(1)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//贪心算法
int currSum = nums[0];
int maxSum = nums[0];
for(int i=1;i<nums.size();i++) {
if(nums[i]>currSum+nums[i]) {
currSum = nums[i];
} else {
currSum +=nums[i];
}
if(currSum>maxSum) {
maxSum = currSum;
}
}
return maxSum;
}
};
3.分治思想:
将区间分为[l,m]和[m+1,r],如区间长度为1时,返回该元素。(2)为了合并子区间之间的分治结果,我们要维护的信息有:lSum,以l为左端点的子段和,rSum以r为右端点的字段和,mSum表示区间最大字段和,iSum表示区间和。(3)确定维护信息后,对于[l,r]区间,iSum = l.iSum+r.iSum; lSum = max(l.lSum,l.iSum+r.lSum);rSum与lSum类似;mSum = max(max(l.mSum,r.mSum),l.rSum+r.lSum)。
时间复杂度为O(n),空间复杂度为O(logn)
class Solution {
public:
//分治策略(使用分段树)
struct status{
int lSum;
int rSum;
int mSum;
int iSum;
};
status pushUp(status l, status r) {
int iSum = l.iSum+r.iSum;
int lSum = max(l.lSum,l.iSum+r.lSum);
int rSum = max(r.rSum,r.iSum+l.rSum);
int mSum = max(max(l.mSum,r.mSum),l.rSum+r.lSum);
return (status){lSum,rSum,mSum,iSum};
}
status get(vector<int>& nums, int l, int r) {
if(l==r) {
return (status){nums[l],nums[l],nums[l],nums[l]};
}
int m = (l+r)>>1;
status lSub = get(nums,l,m);
status rSub = get(nums,m+1,r);
return pushUp(lSub,rSub);
}
int maxSubArray(vector<int>& nums) {
//分段树。分治策略
return get(nums,0,nums.size()-1).mSum;
}
};