4.1-1
如所有元素都为负,则返回所有元素中最大的负数。
4.1-2(暴力法求最大和子数组)

struct subarray { int start, end, sum; }; void bruteFindMaxSubarray(int a[], int left, int right, struct subarray* result) { int i, j, sum=a[left]; int tempSum; int l = left; int r = l; for(i=left; i<=right; i++) { tempSum = a[i]; for(j=i+1; j<=right; j++) { tempSum += a[j]; if(tempSum > sum) { l = i; r = j; sum = tempSum; } } } result->start = l; result->end = r; result->sum = sum; }
4.1-3(归并算法求最大和子数组)

int mergeFindSub(int a[], int l, int r, int result[]) { int i, j, k, mid; int leftSum = 0; int rightSum = 0; int crossSum = 0; int leftResult[3] = {0}; int rightResult[3] = {0}; int crossResult[3] = {0}; if(l == r) { result[0] = l; result[1] = r; result[2] = a[l]; } else { mid = (l + r) / 2; leftSum = mergeFindSub(a, l, mid, leftResult); rightSum = mergeFindSub(a, mid+1, r, rightResult); crossSum = crossingSub(a, l, mid, r, crossResult); if(leftSum >= rightSum && leftSum >= crossSum) for(i=0; i<3; i++) result[i] = leftResult[i]; else if(rightSum >= leftSum && rightSum >= crossSum) for(j=0; j<3; j++) result[j] = rightResult[j]; else for(k=0; k<3; k++) result[k] = crossResult[k]; } return result[2]; } int crossingSub(int a[], int l, int m, int r, int result[]) { int i, j, leftSum, rightSum, sum; int min = -10000; rightSum = min; leftSum = min; sum = 0; for(i=m; i>=l; i--) { sum += a[i]; if(sum > leftSum) { result[0] = i; leftSum = sum; } } sum = 0; for(j=m+1; j<=r; j++) { sum += a[j]; if(sum > rightSum) { result[1] = j; rightSum = sum; } } result[2] = leftSum + rightSum; return result[2]; }
4.1-4
如果允许空串,只要加一句
if (sum < 0) return sum=0;
4.1-5(线性算法求最大和字串)

void linearFindSub(int a[], int n, int result[]) { int i, l, temp, sum; int min = -10000; sum = min; temp = 0; l = 0; for(i=0; i<n; i++) { if(temp < 0) { temp = a[i]; l = i; } else temp += a[i]; if(sum < temp) { result[0] = l; result[1] = i; sum = temp; } } result[2] = sum; }