【面试题】连续子数组的最大和

本文介绍如何使用动态规划解决连续子数组最大和问题,详细解释了算法思路、递推公式及实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

有一个整型数组,里面的元素有正数和负数,一个或者连续的多个元素组成一个子数组,求所有子数组的和的最大值。也就是连续子数组最大和问题。

分析

这道题一般使用动态规划来做,面试的时候问到也是考察动态规划。f(i)表示以i结尾的子数组的最大和。既然是以i结尾,那从何处开始呢?j在i的左边,如果A[0]到A[j]的和为负,那f(i)应该从j+1开始。那f(i)的递推公式怎么算呢?
f(i) = f(i-1) + A[i];条件是f(i-1) > 0
f(i) = A[i];条件是f(i-1) <= 0
要求的结果ans就等于所有f(i)的最大值了。

代码

class Solution {
public:
    int FindGreatestSumOfSubArray(vector<int> array) {
        int len = array.size();
        if(len == 0)
            return 0;
        int k_sum = array.at(0);
        int max_sum = array.at(0);
        for(int i = 1; i < len; i++){
            if(k_sum < 0)
                k_sum = array.at(i);
            else
                k_sum += array.at(i);
            max_sum = max(k_sum, max_sum);
        }
        return max_sum;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值