18708 最大子段和

思路

为了找到一个整数序列中连续且非空的一段使得这段和最大,我们可以使用**Kadane's Algorithm**。该算法的时间复杂度为O(N),适合处理大规模数据。

具体步骤如下:

  1. 初始化两个变量:`max_current`和`max_global`,都设置为序列的第一个元素。

  2. 从第二个元素开始遍历序列,对于每个元素`ai`:

  • 更新`max_current`为`max(ai, max_current + ai)`。

  • 更新`max_global`为`max(max_global, max_current)`。

  1. 最终`max_global`即为所求的最大子段和。

伪代码

```

function find_max_subarray_sum(arr, n):

max_current = arr0

max_global = arr0

for i from 1 to n-1:

max_current = max(arri, max_current + arri)

max_global = max(max_global, max_current)

return max_global

```

C++代码

cpp 复制代码
#include <cstdio>
#include <algorithm>

int find_max_subarray_sum(int arr[], int n) {
    int max_current = arr[0];
    int max_global = arr[0];

    for (int i = 1; i < n; ++i) {
        max_current = std::max(arr[i], max_current + arr[i]);
        max_global = std::max(max_global, max_current);
    }

    return max_global;
}

int main() {
    int n;
    scanf("%d", &n);
    int arr[n];
    for (int i = 0; i < n; ++i) {
        scanf("%d", &arr[i]);
    }

    int result = find_max_subarray_sum(arr, n);
    printf("%d\n", result);

    return 0;
}

总结

通过使用Kadane's Algorithm,我们可以在O(N)的时间复杂度内找到最大子段和。该算法通过动态更新当前子段和和全局最大子段和,确保在遍历完数组后得到正确的结果。使用`scanf`和`printf`可以提高输入输出的效率,适合处理大规模数据。

相关推荐
To_OC1 小时前
LC 15 三数之和:双指针不难,难的是把去重做对
javascript·算法·leetcode
renhongxia13 小时前
世界模型,是“空中楼阁”还是AGI的“最后一块拼图”?
运维·服务器·数据库·人工智能·算法·agi
zmzb01034 小时前
C++课后习题训练记录Day157
开发语言·c++
zephyr056 小时前
动态规划-最长上升子序列问题
算法·动态规划
闪电悠米6 小时前
力扣hot100-56.合并区间-排序详解
数据结构·算法·leetcode·贪心算法·排序算法
卡提西亚7 小时前
leetcode-1438. 绝对差不超过限制的最长连续子数组
算法·leetcode·职场和发展
Java面试题总结7 小时前
LeetCode 93.复原IP地址
算法·leetcode·职场和发展·.net
从零开始的代码生活_8 小时前
C++ 多态详解:虚函数、动态绑定、抽象类与虚表原理
开发语言·c++·后端·学习·算法
yuannl108 小时前
图的存储方式
数据结构
Tisfy8 小时前
LeetCode 3867.数对的最大公约数之和:按题目说的做(gcd)
算法·leetcode·题解·模拟·最大公约数·gcd