给定一个整数数组nums
,找到一各具有最大和的连续子数组(子数组最少包含一个元素)。返回其最大和
解题思路
贪心算法
若当前指针所指元素之前的和小于0,则丢弃当前元素之前的数列。
int maxSubArray(vector<int> &nums)
{
int pre = 0, res = nums[0];
for(const auto &x : nums)
{
//若当前指针所指元素之前的和小于0,则以当前值nums[i]取代。
//若当前指针所指元素之前的和为正数,则看当前值为正还是负数。
pre = max(pre + x,x);
res = max(res,pre); //比较当前值与最大值
}
return res;
}
时间复杂度: O ( N ) O(N) O(N),遍历一次数组
空间复杂度: O ( 1 ) O(1) O(1)
动态规划
只有当 当前指针 所指元素的之前和 大于0时,才加上当前值,否则,抛弃
int maxSubArray(vector<int> &nums)
{
for(int i =1; i< nums.size(); i++)
{
if(nums[i - 1] >0 )
nums[i] += nums[i-1];
}
//vector数组中取 最大值,利用迭代器
return *max_element(nums.begin(),nums.end());
}
时间复杂度: O ( N ) O(N) O(N),遍历一次数组
空间复杂度: O ( 1 ) O(1) O(1)