1,求一个整数数组(可包含正数、负数、0)的子数组的最大和。
int maxSubarraySum(int a[], int size){
int max = -(1<<31);
int sum = 0;
for (int i = 0; i < size; i++) {
if (sum < 0) {
sum = 0;
}
sum += a[i];
max = MAX(max, sum);
}
return max;
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
#pragma mark - 求子数组的最大和
int c[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int b[] = {-6, -5, 0, 0, -3, -6, -7, -8};
int result = maxSubarraySum(b, 8);
NSLog(@"result : %d", result);
}
return 0;
}
原理:复杂度为o(n),循环了n次。如果和为负,无论后面加的什么数,和都会减小,所以置0。取当前和与曾经和之中最大的那个值。