算法题每日一练---第36天:连续子数组的最大和

简介: 输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

1.png

一、问题描述


输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。


题目链接:连续子数组的最大和


二、题目要求


要求:

  • 1 <= arr.length <= 10^5
  • -100 <= arr[i] <= 100
  • 要求时间复杂度为O(n)。


示例:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。


考察

动态规划中等题型
建议用时5~15min


三、问题分析


还是用我们的三步走老套路:


第一步含义搞懂:


这一题在力扣上面是简单题,但我第一次做想了半天要怎么往动态规划上面靠拢,瞬间觉得这一题不简单。先看题目要求是什么,求出数组中连续子数组的最大值,下面就以示例里面的值讲解。


设一维数组dp[i]就代表从区间1~i的范围里面,以num[i]结尾的连续子数组最大值。


第二步变量初始:


这一题我们只需要初始一个变量就行,那就是dp[0]=nums[0]


第三步规律归纳:


这一步就是最关键的一步了,能不能娶上媳妇就看最后一哆嗦了。

我先把nums数组和dp数组里面的值列举一下,看看能不能发现规律:

11.png


仔细看一下,每一个dp[i]是如何得到的,是不是当前位的num[i]加上前面一个dp[i-1]数又或是没加,那没加是因为前面的数是负的嘛。所以,规律出现:


12.png

三步走,打完收工!


四、编码实现


#include<iostream>usingnamespacestd;
intmain()
{
longlonginti,n,dp[100005],nums[100005],max;//初始化变量cin>>n;//输入数组大小for(i=0;i<n;i++)
    {
cin>>nums[i];//输入数组数据    }
max=dp[0]=nums[0];//变量初始for(i=1;i<n;i++)//循环判断    {
if(dp[i-1]<=0)//负数是本身        {
dp[i]=nums[i];
        }
elsedp[i]=nums[i]+dp[i-1];//正数加上上一个if(dp[i]>max)//是否大于当前max        {
max=dp[i];
        }
    }
cout<<max;//输出结果return0;
}

五、测试结果

14.png


相关文章
|
6月前
|
设计模式 算法 Java
【数据结构和算法】删掉一个元素以后全为 1 的最长子数组
这是力扣的 1493 题,难度为中等,解题方案有很多种,本文讲解我认为最奇妙的一种。又又又是一道滑动窗口的典型例题,可以帮助我们巩固滑动窗口算法。这道题很活灵活现,需要加深对题意的变相理解。给你一个二进制数组nums,你需要从中删掉一个元素。 请你在删掉元素的结果数组中,返回最长的且只包含 1 的非空子数组的长度。 如果不存在这样的子数组,请返回 0 。
110 1
|
6月前
|
算法
class071 子数组最大累加和问题与扩展-下【算法】
class071 子数组最大累加和问题与扩展-下【算法】
50 0
|
11月前
|
算法 测试技术 C#
C++前缀和算法的应用:统计中位数为 K 的子数组
C++前缀和算法的应用:统计中位数为 K 的子数组
|
3月前
|
算法
【算法】滑动窗口——长度最小的子数组
【算法】滑动窗口——长度最小的子数组
|
1月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
69 0
|
6月前
|
算法
|
3月前
|
算法 C++
【算法】前缀和算法——和可被K整除的子数组
【算法】前缀和算法——和可被K整除的子数组
|
3月前
|
算法
【算法】前缀和算法——和为k的子数组之和
【算法】前缀和算法——和为k的子数组之和
|
3月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
42 0
|
6月前
|
设计模式 算法 Java
【数据结构和算法】子数组最大平均数 I
​ 原题链接:力扣 643 题 子数组最大平均数 I 给你一个由n个元素组成的整数数组nums和一个整数k。 请你找出平均数最大且长度为k的连续子数组,并输出该最大平均数。 任何误差小于10-5的答案都将被视为正确答案。 ​
70 3