前言
Kadane算法是一种用于求解最大子数组和问题的算法,其时间复杂度为O(n)。
一、kadane算法(C++)
int getMaxSubarraySum(int a[], int n)
{
int maxSum = a[0]; // 最大子数组和,初始为a[0]
int curSum = a[0]; // 当前子数组和,初始为a[0]
for (int i = 1; i < n; i++) {
if (curSum < 0) {
curSum = a[i];//更新起始点
} else {
curSum += a[i];
}
if (curSum > maxSum) {
maxSum = curSum;//找出最大值
}
}
return maxSum;
}
其算法利用的核心思想为做加法之后判断当前和(curSum)是否为负,若为负,则取下一正数为新的起始点,且每一次循环都与当前最大和(maxSum)比较。
二、例题
1.【问题描述】
【问题描述】
对于一个具有 n 个元素的整型数组 a,求具有最大连续和的子数组(最少具有一个元素)。
【输入形式】
输入的第一行为一个整数 n ,接下来的一行为 n 个整数,表示数组的元素。
【输出形式】
输出具有最大连续和的子数组的起始编号和结束编号(数组编号为0~n-1)。
【样例输入】
8
3 -5 1 5 -4 12 0 -1
【样例输出】
2 5
2.解答
代码如下(代码除函数外来源于CG网):
# include <iostream>
using namespace std;
void getMaxSum(int a[], int n, int &Left, int &Right);
int main()
{
int n;
cin>>n;
int *p=new int[n];//使用动态数组
for(int i=0; i<n; i++)
cin>>p[i];
int Left, Right;
getMaxSum(p,n,Left,Right);
cout<<Left<<" "<<Right<<endl;
delete[] p;
return 0;
}
void getMaxSum(int a[], int n, int &Left, int &Right)
//使用int类型引用参数,使得该参数能在函数内部修改
{
int curLeft = 0;
int curRight = 0;
int maxSum = a[0];
int curSum = a[0];
for (int i = 1; i < n; i++) {
if (curSum < 0) {
curSum = a[i];
curLeft = i;
} else {
curSum += a[i];//向前遍历
}
if (curSum > maxSum) {//比较并记录
maxSum = curSum;
curRight = i;
Left = curLeft;
Right = curRight;
}
}
}
最后只是改为记录最大子数组的起始和终止的位置
总结
kadane算法本质是从左向右遍历数组,遇到和为负数则重置当前和,最后在所有结果中找出最大和即为最终解。