题目
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
解法
- 暴力解法
int maxSubArray(int* nums, int numsSize){
int max=nums[0],sum;
for(int i=0;i<numsSize;i++){
sum=0;
for(int j=i;j<numsSize;j++){
sum+=nums[j];
if(sum>max)
max=sum;
}
}
return max;
}
- 动态规划
int maxSubArray(int* nums, int numsSize){
int* dp=malloc(sizeof(int)*numsSize);
dp[0]=nums[0];
for(int i=0;i<numsSize-1;i++){
if(dp[i]+nums[i+1]>nums[i+1]){
dp[i+1]=dp[i]+nums[i+1];
}
else
dp[i+1]=nums[i+1];
}
int max=dp[0];
for(int i=0;i<numsSize;i++){
if(max<dp[i])
max=dp[i];
}
return max;
}
- 贪心算法
int maxSubArray(int* nums, int numsSize){
int sum=0;
int max=nums[0];
for(int i=0;i<numsSize;i++){
sum+=nums[i];
if(max<sum) max=sum;
if(sum<0)
sum=0;
}
return max;
}