题解53 | #动态规划#连续子数组的最大和(一)(二)#

连续子数组的最大和(二)

https://www.nowcoder.com/practice/11662ff51a714bbd8de809a89c481e21

一、求出这个最大连续非空数组的和

#include<iostream>
using namespace std;
int a[200000],dp[200000];
int main(){
    int n,i;
    cin>>n;
    //从0开始
    for(i = 0;i < n;i++){
        cin>>a[i];
    } 
    //初始化一下
    dp[0] = a[0];
    int res = dp[0];
    //从1开始防止数组溢出
    for(i = 1;i < n; i++){
        dp[i] = std::max(dp[i-1] + a[i] , a[i]);
        res = std::max(res , dp[i]);
    }
    cout<<res;
    return 0;
}
// 64 位输出请用 printf("%lld")

算法的基本思想:

这段代码实现了求解最大子数组和的问题,使用了动态规划的思想。

在每个位置i处,维护一个dp数组,表示以i结尾的最大子数组和。

对于每个位置i,dp[i]的值可以通过dp[i-1]和a[i]的值来计算,即dp[i] = max(dp[i-1]+a[i],a[i])。

同时,用一个变量res来记录最大的dp[i]值,即为最终的最大子数组和。

时间复杂度为O(n),其中n是数组的大小。

空间复杂度也为O(n),因为动态规划数组`dp`的大小与输入数组相同。

二、要保存这个非空连续最大数组返回

#include <algorithm>
#include <vector>
class Solution {
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param array int整型vector
     * @return int整型vector
     */
    vector<int> FindGreatestSumOfSubArray(vector<int>& a) {
        // write code here
        vector<int> res;
        vector<int> dp(a.size(), 0);
        
        dp[0] = a[0];
        int max_val = a[0];//注意初始化
        
        int left = 0,right = 0;
        int res_l = 0,res_r = 0;

        for (int i = 1; i < a.size(); i++) {
            right++;
            dp[i] = std::max(dp[i-1] + a[i], a[i]);
            if (dp[i-1] + a[i] < a[i]) {
                left = right;
            }
            if (dp[i] > max_val || dp[i] == max_val
            && (right - left + 1) > (res_r - res_l + 1)) {
                max_val = dp[i];
                res_l = left;
                res_r = right;
            }
        }

        for (int i = res_l; i <= res_r; i++) {
            res.push_back(a[i]);
        }
        return res;
    }
};
static const auto io_sync_off = []() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    return nullptr;
}
();//加速的罢了

算法基本思想:

使用动态规划的思想,维护一个数组dp,dp[i]表示以第i个元素结尾的子数组的最大和。对于每个元素,如果前面的子数组和为负数,则直接从当前元素开始重新计算,否则加上前面的子数组和。同时记录最大值和最大子数组的左右端点。

时间复杂度:

O(n),需要遍历整个数组。

空间复杂度:

O(n),需要维护一个长度为n的dp数组。

2024考研数据结构 文章被收录于专栏

本人考研刷算法题,立此专栏练习强化。

全部评论

相关推荐

Dream_coding:你是不是只投大厂了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务