快要毕业了,逐步把之前做过的一些算法和数据结构,项目相关资料总结整理一下,一来温习一下之前的知识,二来记录下学习点滴,方便之后的学习。
题目描述:给定一个整数数组,数组中有正数也有负数,数组中连续的一个或者多个整数组成一个子数组,每个子数组都有一个和,求给定数组的最大子数组和。也成为“最大子段和”问题。要求时间复杂度为O(n).
该题目是一个简单的DP问题。算法的思路很多,但是如果要满足时间复杂度为O(n)。一般的算法是达不到的。
DP解决该问题的思路是:扫描数组,记录当前数组的和 与 已经记录的最大的子数组的和。如果当前记录的和已经是负数,那么舍弃它,并重新设置当前数组和为当前元素的值。否则,比较当前数组的和与已经记录的最大的子数组的和大小,如果比最大的和大,就更新最大和。扫描一遍完成统计,满足题目的要求。
算法实现如下:
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
int maxSubSum(int *a,int n){
assert(n > 0);
int max = 0,curSum = 0;
for(int i = 0;i < n;i++){
if(curSum > 0){
curSum += a[i];
}
else{
curSum = a[i];
}
if(curSum > max){
max = curSum;
}
}
re