给定一个整数数组 nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
1、复杂度为O(n*n)的解法(思路:查询n轮,每轮获取以第i个开头的最大子序列,如:1,2,3;1,3,4.。。。。
第二轮获取的子序列的最大值跟第一轮比较,保留最大的,依次类推)
int maxSum(vector<int> nums) {
int len=nums.size();
int count=0,indexI=0,indexJ=0;
int max=nums[0];
for(int i=0;i<len;i++){
count=nums[i];
if(max<nums[i]){
max=nums[i];
indexI=i;
indexJ=i;
}
for(int j=i+1;j<len;j++){
count+=nums[j];
if(count>max){
max=count;
indexI=i;
indexJ=j;
}
}
}
}
2、复杂度为O(n)的解法 (思路:n个数字相加获取总和,1、如果总和小于0,则下一次执行从下一个数字为初始值,同时把当前的总和跟上一次的总和、当前的元素分别对比保留最大值,2、如果总和大于0,则继续相加,同时把最大的和更新)
for(auto vec:nums){
count+=vec;
if(count>0){
if(count>max){
max=count;
}
}else{
printf("max ===%d,,,count==%d\n",max,count);
if(count>=max){
max=count;
}else{
if(max<vec)
{
max=vec;
}
}
count=0;
}
}