数据结构(五十)
学习数据结构与算法过程中的心得体会以及知识点的整理,方便我自己查找,也希望可以和大家一起交流。
—— 最大子数组和 ——
1.题目描述
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
与主站的第53题相同
示例:
输入:
nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:
6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
输入:
nums = [1]
输出:
1
输入:
nums = [5,4,-1,7,8]
输出:
23
2.代码
c
int maxSubArray(int* nums, int numsSize){
if(numsSize == 1)
return nums[0];
int MaxNum = nums[0],sum = 0;
for(int i =0;i <numsSize;i++){
for(int x =i;x <numsSize;x++){
sum += nums[x];
if(MaxNum < sum)
MaxNum = sum;
}
sum = 0;
}
return MaxNum;
}
这道题虽然是“简单”题,但是我们需要更好地优化算法才能达成目的。上述这样最暴力的解法往往会超时,而且这并不是最佳的算法,我们试试运用贪心算法,时间复杂度O(n),空间复杂度O(1)。
int maxnum(int a,int b){
if(a>b)
return a;
else
return b;
}
int maxSubArray(int* nums, int numsSize){
if(numsSize == 1)
return nums[0];
int MaxNum = nums[0],sum = nums[0];
for(int i = 1; i < numsSize; i++){
sum = maxnum(nums[i], sum + nums[i]);
MaxNum = maxnum(MaxNum, sum);
}
return MaxNum;
}
还可以运用动态规划,时间复杂度O(n),空间复杂度O(1)。
int maxSubArray(int* nums, int numsSize){
if(numsSize == 1)
return nums[0];
int MaxNum = nums[0];
for(int i = 1; i < numsSize; i++){
if(nums[i-1] > 0)
nums[i] += nums[i-1];
if(MaxNum < nums[i])
MaxNum = nums[i];
}
return MaxNum;
}