您的位置:首页 > 其它

[leetcode]Maximum Subarray

2015-10-09 14:34 246 查看
SubArray是连续的

class Solution {//分治,时间复杂度O(nlogn)
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
return maxSubArray2(&nums[0],n);//vector转数组
}

int maxSubArray2(int A[],int n){
if(n==1){//递归终止条件
return A[0];
}
int mid=n>>1;
//0..mid-1 //mid..n-1
int answer=max(maxSubArray2(A,mid),maxSubArray2(A+mid,n-mid));
int now=A[mid-1],may=now;
for(int i=mid-2;i>=0;--i){//向左扫描
may=max(may,now+=A[i]);
}
now=may;
for(int j=mid;j<n;++j){//向右扫描
may=max(may,now+=A[j]);
}
return max(answer,may);
}
};


class Solution {//DP,时间复杂度O(n),空间复杂度O(n)
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();

vector<int> dp(n);
dp[0]=nums[0];
int answer=dp[0];

for(int i=1;i<n;++i){
dp[i]=max(dp[i-1]+nums[i],nums[i]);
answer=max(dp[i],answer);
}
return answer;}

};


class Solution {//DP,时间复杂度O(n),空间复杂度O(1)
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
int endHere=nums[0];
int answer=nums[0];

for(int i=1;i<n;++i){
endHere=max(endHere+nums[i],nums[i]);
answer=max(endHere,answer);
}
return answer;

}

};


class Solution {//线性算法,通过sum求解
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();

int sum=nums[0];
int minSum=min(0,sum);//所有sum的最小值
int answer=nums[0];

for(int i=1;i<n;++i){
sum+=nums[i];//前i项的和
answer=max(answer,sum-minSum);//结果
minSum=min(minSum,sum);//更新minSum
}
return answer;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: