给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
提示:
1 <= nums.length <= 105
-104 <= nums[i] <= 104
第一思路:
面对这道题时,我的第一思路是暴力,代码如下:
int maxSubArray(int* nums, int numsSize)
{
int i,j,k,p,sum=0,max=num[0];
for(i=1;i<=numsSize;i++) //控制加的个数变化
{
for(j=0;j<=(numsSize-i);j++) //控制从何处开始加
{
for(k=j,p=0;p<i;k++,p++) //控制加的开始和结束
{
sum=sum+nums[k];
}
if(sum>max) //比较并替换
max=sum;
sum=0;
}
}
return max;
}
此时我最大的问题是:没有考虑运行时间,示例所给的测试用例可以通过,但提交后,问题出现了,当数组足够大时,运行必然超时,时间复杂度超过了限制;
于是,我开始重新思考,有了以下题解:
int maxSubArray(int* nums, int numsSize)
{
int i,max=nums[0],sum=nums[0]; //创建max变量用于存储最大子序和,sum用来存储当前子序和
for(i=1;i<numsSize;i++)
{
if(sum+nums[i]>nums[i]) //若当前子序和加当前数大于当前数,则加之
sum=sum+nums[i];
else
sum=nums[i]; //反之,则弃置,以当前数为子序和
if(sum>max) //比较,替换
max=sum;
}
return max;
}