C++输入一个整数数组,请找出一个连续的子数组,令该子数组的和最大。
时间: 2024-12-11 18:17:36 浏览: 7
在C++中,你可以使用Kadane's Algorithm(凯撒求和算法)来解决这个问题。这个算法是一种动态规划方法,用于寻找给定整数数组中最长递增子序列的和,但它同样适用于找到最大的连续子数组和。
以下是基本步骤:
1. 初始化两个变量:`max_so_far` 和 `current_sum`,分别表示到目前为止的最大子数组和以及当前连续子数组的和。假设第一个元素就是`current_sum`,初始值为数组的第一个元素。
2. 遍历数组,对于每个元素:
a. 将当前元素添加到 `current_sum` 中。
b. 如果 `current_sum` 为负数,说明从上一个正数开始的子数组和更大,更新 `current_sum` 为当前元素本身。
c. 否则,如果 `current_sum` + 当前元素比 `max_so_far` 大,更新 `max_so_far`。
3. 在遍历结束后,`max_so_far` 就是最大的连续子数组和。
```cpp
#include <iostream>
#include <climits>
int maxSubArraySum(int arr[], int n) {
int max_so_far = INT_MIN;
int current_sum = arr[0];
for (size_t i = 1; i < n; ++i) {
current_sum += arr[i];
if (current_sum > max_so_far)
max_so_far = current_sum;
else if (current_sum < 0)
current_sum = 0; // 重置当前子数组和
}
return max_so_far;
}
int main() {
int arr[] = { -2, 1, -3, 4, -1, 2, 1, -5, 4 };
int n = sizeof(arr) / sizeof(arr[0]);
std::cout << "Maximum contiguous sum is: " << maxSubArraySum(arr, n);
return 0;
}
```
阅读全文