问题描述:输入若干个整型数据(可能有正数和负数),存放在顺序表中,求顺序表中连续子表(最少有一个元素)的最大和。 提升要求:时间复杂度不超过O(n) C语言
时间: 2024-09-29 15:10:07 浏览: 52
算术运算符的优先级和结合性-c语言课件\\第6章 数据类型和表达式
这个问题可以使用动态规划(Dynamic Programming)的滑动窗口(Sliding Window)思想来解决。在C语言中,我们可以创建两个变量,一个记录当前子数组的和(sum),另一个记录全局最大和(max_sum)。遍历顺序表的同时,更新这两个值:
```c
#include <stdio.h>
int maxSubArraySum(int arr[], int n) {
if (n == 0) return 0; // 空数组的情况
int sum = arr[0], max_sum = arr[0]; // 初始和等于第一个元素
for (int i = 1; i < n; i++) { // 遍历数组
sum += arr[i]; // 每次加当前元素
if (sum > 0) max_sum = max(max_sum, sum); // 如果累加和大于0,更新最大和
else { // 否则,如果累加和小于0,从当前元素开始重置累加和
sum = arr[i];
}
}
return max_sum; // 返回最大子数组和
}
int main() {
int arr[] = {-2, 1, -3, 4, -1, 2, 1, -5, 4};
int n = sizeof(arr) / sizeof(arr[0]);
printf("最大的子数组和是: %d\n", maxSubArraySum(arr, n));
return 0;
}
```
这个算法的时间复杂度是O(n),因为它只需要遍历一次数组。
阅读全文