算法与数据结构——整数数组求最大子数组
题目:
输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n)。
代码:
#include <iostream>
#include <math.h>
using namespace std;
int nums[] = {2, -3, 4, 5};
//2,-1,4,9
//sum[] = {1, -1, 2, 12, 8, 15, 17, 12};
//数组长度也可以写个函数自己输入
int main()
{
int dp[4] = {nums[0]};
//dp[i] = max(dp[i-1] + nums[i], nums[i]);
for (int i = 0; i < 4; i++)
{
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
//cout << dp[i] << " ";
}
//取sum中的最大值
int Max = dp[0];
for (int i = 1; i < 4; ++i)
if (dp[i] > Max)
Max = dp[i];
cout << Max;
return 0;
}
总结:
关键在于,dp[i] = max(dp[i-1] + nums[i], nums[i]);
dp[]表示动态规划数组,得到的是相比较后的最大数组,
该算法利用,动态规划思想,通过比较当前数组位的值,与先前判断过的规划后的数组值加上当前数组位的值,两者比较,最大值留下,从而得到求出整数数组中最大子数组的和。