无名小辈-欢迎点评
比分治算法性能更优越的解决最大子数组问题
时间复杂度为O(n)
//头文件 inc.h
#pragma once
#include <iostream>
using namespace std;
class CReslut {
public:
int max_left;//最大子数组左边界
int max_right;//最大子数组右边界
int max_sum;//最大子数组和
CReslut() {
max_left = 0;
max_right = 0;
max_sum = 0;
};
};
算法:传入数组地址,数组长度
CReslut Find_MAX_DP(int *A,int length) {
int max_left = 0;
int max_right = 0;
int max_sum = A[0];
int psum = max_sum;
int p = max_left;
for (int i = 0; i < length; i++) {
if (i > max_right) {
if (psum > 0)
psum += A[i];
else {
p = i;
psum = A[i];
}
}
if (A[i] >= 0&& psum >= max_sum) {
max_left = p;
max_right = i;
max_sum = psum;
psum = max_sum;
}
}
CReslut re;
re.max_left = max_left;
re.max_right = max_right;
re.max_sum = max_sum;
return re;
}
测试代码:
#include<iostream>
#include "inc.h"
using namespace std;
int main() {
//测试集
int* A = new int[16];
A[0] = 13; A[1] = -3; A[2] = -25; A[3] = 20; A[4] = -3;
A[5] = -16; A[6] = -23; A[7] = 18; A[8] = 20; A[9] = -7;
A[10] = 12; A[11] = -5; A[12] = -22; A[13] = 15; A[14] =-4;
A[15] = 7;
for (int i = 0; i < 16; i++) {
cout << A[i] << endl;
}
CReslut reMy = Find_MAX_DP(A,16);
cout << "最大子数组和:" << reMy.max_sum << endl;
cout << "左边界:" << reMy.max_left << endl;
cout << "右边界:" << reMy.max_right << endl;
delete[]A;
}
测试结果: