【题目描述】
Find the contiguous subarray within an array (containing at least one number) which has the largest sum.
For example, given the array [−2,1,−3,4,−1,2,1,−5,4]
,
the contiguous subarray [4,−1,2,1]
has the largest sum = 6
.
1.dp。记录当前元素之和即当前元素和的最大值,与所得的最大值进行比较,如果大于则进行更新,否则继续。如果在遍历的过程中,当前元素和小于0,则将其值归于0。遍历结束后,如果最大值等于0,则输出元素中的最大值。
2.divide and conquer。还有问题,解决了再贴上来。
3.kadane算法:规则是如果前面一段连续子数组的和小于0,那么就丢弃它。其实也蛮好理解的,举个简单例子,比如:数组-1, 2, 3
,-1为负数,为了使得子数组之和最大,显然不应当把-1计入进内。
【代码】
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int nz=nums.size();
int maxsum=0;
int cursum=0;
for(int i=0;i<nz;i++){
cursum+=nums[i];
if(cursum<0) cursum=0;
if(cursum>maxsum) maxsum=cursum;
}
if(maxsum==0){
maxsum=nums[0];
for(int i=1;i<nz;i++){
if(nums[i]>maxsum) maxsum=nums[i];
}
}
return maxsum;
}
};
3.
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int maxsofar,maxendhere;
maxsofar=maxendhere=nums[0];
for(int i=1;i<nums.size();i++){
maxendhere+=nums[i];
if(maxendhere<nums[i]) maxendhere=nums[i];
if(maxendhere>maxsofar) maxsofar=maxendhere;
}
return maxsofar;
}
};