用c语言编写:输入若干个整型数据(可能有正数和负数),存放在顺序表中,求顺序表中连续子表(最少有一个元素)的最大和。 提升要求:时间复杂度不超过O(n)
时间: 2024-10-08 08:27:18 浏览: 42
在 C 语言中,解决这个问题可以采用 Kadane 算法(也称为动态规划算法)。这个算法可以在遍历一次数组的过程中找到最大子数组和,其核心思想是维护两个变量:当前子数组和(cumulative sum),以及全局最大子数组和。
以下是一个简单的 C 代码示例:
```c
#include <stdio.h>
// 函数声明
int maxSubArraySum(int arr[], int size);
int main() {
int n;
printf("请输入整数个数:");
scanf("%d", &n);
// 假设数组长度足够大
int* arr = malloc(n * sizeof(int));
printf("请输入 %d 个整数:", n);
for (int i = 0; i < n; ++i) {
scanf("%d", arr + i);
}
int result = maxSubArraySum(arr, n);
printf("最大子数组和为:%d\n", result);
free(arr); // 不要忘记释放内存
return 0;
}
// 求解最大子数组和的函数
int maxSubArraySum(int arr[], int size) {
if (size <= 0) return 0; // 如果数组为空,和为0
int current_sum = arr[0]; // 当前子数组和
int global_max = arr[0]; // 最大子数组和
for (int i = 1; i < size; ++i) {
current_sum = MAX(current_sum + arr[i], arr[i]); // 更新当前子数组和
if (current_sum > global_max) {
global_max = current_sum; // 更新全局最大值
}
}
return global_max;
}
// 定义一个辅助函数用于计算较大的两个数
#define MAX(a, b) ((a) > (b) ? (a) : (b))
```
在这个代码中,`maxSubArraySum` 函数的时间复杂度确实是 O(n),因为我们只遍历了一次数组。当你运行这个程序时,用户会被提示输入整数的数量和数值,然后它会找出并打印出最大的连续子数组和。
阅读全文