题目描述
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例
输入: [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
方法一:暴力解法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
int sum=0;
int max=INT_MIN; // int范围内的最小值
for(int i=0;i<n;i++)
{
sum=0;
for(int j=i;j>=0;j--)
{
sum+=nums[j];
if(sum>max) max=sum;
}
}
return max;
}
};
复杂度分析:
- 时间复杂度:O(n^2),两个for循环,时间复杂度较高,
- 空间复杂度:O(1),只用到了常数变量存放数据。
方法二:动态规划
思路:用 f(i)代表以第 i个数结尾的「连续子数组的最大和」,故我们不难得到状态转移方程:f[i]=max(f[i-1]+nums[i],nums[i]);最后我们只需求出f数组中的最大值即可。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
vector<int> f(n);
int max_num=nums[0];
f[0]=nums[0];
for(int i=1;i<n;i++)
{
f[i]=max(f[i-1]+nums[i],nums[i]);
max_num=max(max_num,f[i]);
}
return max_num;
}
};
复杂度分析:
- 时间复杂度:O(n),只用了一次循环遍历数组,
- 空间复杂度:O(n),创建了一个新的动态数组存放数据。