子数组的最大累加和问题

子数组的最大累加和问题

题目描述

给定一个数组arr,返回子数组的最大累加和

例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.

[要求]

时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)

输入描述:

第一行一个整数N。表示数组长度
接下来一行N个整数表示数组内的元素

输出描述:

输出一个整数表示答案

示例1
输入
7
1 -2 3 5 -2 6 -1
输出
12
备注:

1 ⩽ N ⩽ 1 0 5 1 \leqslant N \leqslant 10^5 1N105
− 100 ⩽ a r r i ⩽ 100 -100 \leqslant arr_i \leqslant 100 100arri100


题解:

此题值得好好研究,可以感受一步步将算法从最基础的 O ( n 3 ) O(n^3) O(n3) 优化到 O ( n ) O(n) O(n) 的快感。

具体参考:连续子数组最大和

代码:
#include <cstdio>
#include <algorithm>

using namespace std;

int main(void) {
    int n, val;
    int cur = 0;
    int ret = 0;
    scanf("%d", &n);
    while ( n-- ) {
        scanf("%d", &val);
        cur += val;
        if ( cur < 0 ) cur = 0;
        else ret = max( ret, cur );
    }
    return 0 * printf("%d\n", ret);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最大数组问题是一个经典的算法问题,可以使用C语言来实现。 首先,我们可以定义一个函数来计算最大数组的和,传入一个整型数组数组的大小。如下所示: ```c int maxSubarraySum(int arr[], int size); ``` 然后,在函数内部,我们可以使用动态规划的思想来解决这个问题。我们可以创建一个变量`maxSum`和`currentSum`,分别表示当前最大数组的和和当前累加的和。初始化`maxSum`为数组第一个元素,`currentSum`为0。 接下来,我们使用一个循环遍历整个数组。在循环内部,我们首先将`currentSum`加上当前元素的值,然后判断`currentSum`是否大于`maxSum`,如果是,则将`maxSum`更新为`currentSum`。如果`currentSum`小于0,则将`currentSum`重置为0,相当于从当前位置重新开始累加。 最后,循环结束后,我们可以得到最大数组和`maxSum`。返回`maxSum`即可。 下面是完整的代码实现: ```c #include <stdio.h> int maxSubarraySum(int arr[], int size) { int maxSum = arr[0]; int currentSum = 0; for (int i = 0; i < size; i++) { currentSum += arr[i]; if (currentSum > maxSum) { maxSum = currentSum; } if (currentSum < 0) { currentSum = 0; } } return maxSum; } int main() { int arr[] = { -2, 1, -3, 4, -1, 2, 1, -5, 4 }; int size = sizeof(arr) / sizeof(arr[0]); printf("最大数组的和为:%d\n", maxSubarraySum(arr, size)); return 0; } ``` 运行这段代码,输出结果为:最大数组的和为:6。这个结果对应的最大数组为:[4, -1, 2, 1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值