题目描述
当我们拥有一个整数数组 nums 时,需要找出一个具有最大和的连续子数组并返回其最大和(最少包含一个元素)
C 语言具体代码实现
第一种算法:动态规划!!!
从数组的第二项元素开始,若前面一项元素的值大于 0,则将前面一项的元素值加到当前项上来,最后找到数组中的最大值,此值即为连续子数组的最大和
#include <stdio.h>
int maxSubArray(int *nums, int numsSize){
// 动态规划
for(int i = 1; i < numsSize; i++){
if(nums[i-1] > 0){
nums[i] += nums[i-1];
}
}
int Max = nums[0];
for(int i = 1; i < numsSize; i++){
if(nums[i] > Max){
Max = nums[i];
}
}
return Max;
}
int main(void){
int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int max = maxSubArray(nums, 9);
printf("最大子数组和:%d", max); // 最大子数组和:6
return 0;
}
第二种算法:贪心算法!!!
若当前指针所指元素与之前元素的和小于此元素,则丢弃当前元素之前的数列
#include <stdio.h>
#include <math.h>
// 贪心算法
int maxSubArray(int *nums, int numsSize){
int current_num, max_num;
current_num = max_num = nums[0];
for(int i = 1; i < numsSize; i++){
current_num += fmax(nums[i], current_num+nums[i]);
max_num = fmax(max_num, current_num);
}
return max_num;
}
int main(void){
int nums[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int max = maxSubArray(nums, 9);
printf("最大子数组和:%d", max); // 最大子数组和:6
return 0;
}