跟着姚桑学算法-连续子数组的最大和

简介: 剑指offer算法

题. 连续子数组的最大和

输入一个 非空 整型数组,数组里的数可能为正,也可能为负。

数组中一个或连续的多个整数组成一个子数组。

求所有子数组的和的最大值。

要求时间复杂度为 O(n)。

数据范围
数组长度 [1,1000]。
数组内元素取值范围 [−200,200]。

样例

输入:[1, -2, 3, 10, -4, 7, 2, -5]

输出:18

【题解】-- 动态规划

当前0~i的数组中 , nums[i]参与的子数组的最大和,只有两种情况:

  1. 与前面的子数组的最大和相加, PreMaxSum加上nums[i],
  2. 不与前面的子数组相加,单独自己成为一个新的子数组。

要求最大和,那么取两种情况中最大的和。

题目要求的是连续子数组的和,那么PreMaxSum必须也是nums[i-1]参与的数组和的最大值;

那么我们定义dp[i] 是当前0~i的数组中,索引为i的数字参与的数组和的最大值;

上述情况可以定义为

dp[i] = max(dp[i-1]+nums[i],nusm[i]);
在这里插入图片描述

复杂度分析:

动态规划的总时间复杂度为O(n)。

C++代码实现:

class Solution {
public:
    int dp[100010];
    int maxSubArray(vector<int>& nums) {
        nums.insert(nums.begin(),0);
        int ans = -9999999;
        for(int i = 1;i<nums.size();i++){
            dp[i] = max(dp[i-1]+nums[i],nums[i]);
            ans = max(ans,dp[i]);
        }

        return ans;
    }
};
目录
相关文章
|
13天前
|
设计模式 算法 Java
【数据结构和算法】删掉一个元素以后全为 1 的最长子数组
这是力扣的 1493 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。又又又是一道滑动窗口的典型例题,可以帮助我们巩固滑动窗口算法。这道题很活灵活现,需要加深对题意的变相理解。给你一个二进制数组nums,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组,请返回 0 。
67 1
|
13天前
|
算法
class071 子数组最大累加和问题与扩展-下【算法】
class071 子数组最大累加和问题与扩展-下【算法】
29 0
|
5月前
|
算法 测试技术 C#
C++前缀和算法的应用:统计中位数为 K 的子数组
C++前缀和算法的应用:统计中位数为 K 的子数组
|
7月前
|
算法
【算法专题突破】滑动窗口 - 长度最小的子数组(9)
【算法专题突破】滑动窗口 - 长度最小的子数组(9)
22 0
|
5月前
|
算法 测试技术 C#
C++前缀和算法的应用:统计得分小于K的子数组数目
C++前缀和算法的应用:统计得分小于K的子数组数目
|
13天前
|
算法
|
5天前
|
算法 C语言
[优选算法]------滑动窗⼝——209. 长度最小的子数组
[优选算法]------滑动窗⼝——209. 长度最小的子数组
|
13天前
|
设计模式 算法 Java
【数据结构和算法】子数组最大平均数 I
​ 原题链接:力扣 643 题 子数组最大平均数 I 给你一个由n个元素组成的整数数组nums和一个整数k。 请你找出平均数最大且长度为k的连续子数组,并输出该最大平均数。 任何误差小于10-5的答案都将被视为正确答案。 ​
46 3
|
13天前
|
算法 测试技术 C#
【滑动窗口】C++算法:K 个不同整数的子数组
【滑动窗口】C++算法:K 个不同整数的子数组
|
13天前
|
算法 测试技术 C#
【滑动窗口】【二分查找】C++算法:和至少为 K 的最短子数组
【滑动窗口】【二分查找】C++算法:和至少为 K 的最短子数组