题目
使用如下思想为最大子数组问题设计一个非递归的、线性时间的算法。从数组的左边界开始,由左至右处理,记录到目前为止已经处理过的最大子数组。若已知A[1..j] 的最大子数组,基于如下性质将解扩展为A[1..j+1] 的最大子数组:A[1..j+1] 的最大子数组要么是A[1..j] 的最大子数组,要么是某个子数组A[i..j+1](1≤i≤j+1) 。在已知A[1..j] 的最大子数组的情况下,可以在线性时间内找出形如A[i..j+1] 的最大子数组。
答题
用C++ 语言编写的代码如下:
struct Sub {
int low;
int high;
int sum;
};
Sub FindMaximumSubarray3(int arr[], int count) {
Sub best = { 0, 0, -1 };
Sub cur = { 0, 0, -1 };
for (int i = 0; i < count; ++i) {
if (cur.sum < 0) {
cur.low = i;
cur.high = i;
cur.sum = arr[i];
} else {
cur.high = i;
cur.sum += arr[i];
}
if (cur.sum > best.sum) {
best = cur;
}
}
return best;
}
|