首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

最大连续子序列和(最大子数组和)四种最详细的解法

问题描述:给一个数组,有正有负,求其连续子序列的最大值 解法1:穷举暴力法 枚举左端点跟右端点,然后遍历更新所有的子序列和,最终得到结果就是最大的 #include using...,队首元素是整个序列的最小值,维护队列的同时,用前缀和的元素减去这个最小值,得到值最大,为这数组的子序列的最大值 #include using namespace std..., 每一步的决策无非就是,是否继续把下一个元素加入当前的子段....我们开一个数组dp[] , 记录dp[i]表示以a[i]结尾的 全部子段中 最大的那个的 和。 这样我们就可以根据它dp[i] 的正负,去考虑是否把下一个元素加入到当前的子段。...如果dp[i] 是负数,那么我们为什不从a[i+1]新维护一个子段呢? 如果dp[i] 是正数,那么显然可以继续把a[i+1] 加入到当前的子段。 最后我们只需要找出所有最大子段中,最大的那个。

5.8K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Leetcode|线性序列|5342. 连续子数组的最大和(暴力+贪心+动态规划包含结尾元素)

    return maxSum; } }; 2 区间贪心 时间复杂度:O(n) 局部最优:当前和为负数时立即停止加和,因为前面的负数和只会拉低后面的和(全负数案例 ) 全局最优:选取最大“连续和...int maxSubArray(vector& nums) { int maxSum = INT_MIN; int curSum = 0; // 当前区间中的和...++) { curSum += nums[i]; maxSum = max(maxSum, curSum); // 核心:若之前的curSum...return maxSum; } }; 3 动态规划(未状态压缩) 【本题特点】:子数组要保证连续性,由于存在负数,不适合用滑动窗口方法 【解题关键】:dp[i]数组含义要包含结尾元素的默认添加...【选择】:①nums[i]独立成组 or ②加入到i - 1的数组中 【状态转移方程】:dp[i] = max(nums[i], dp[i - 1] + nums[i]) class Solution

    54110

    最长连续子序列 - 华为OD机试题

    题目描述 有N个正整数组成的一个序列。给定整数sum,求长度最长的连续子序列,使他们的和等于sum,返回此子序列的长度, 如果没有满足要求的序列,返回-1。...输入描述 第一行输入是:N个正整数组成的一个序列。 第二行输入是:给定整数 sum。 输出描述 最长的连续子序列的长度。...备注 输入序列仅由数字和英文逗号构成,数字之间采用英文逗号分隔 序列长度:1 <= N <= 200 输入序列不考虑异常情况 示例一 输入: 1,2,3,4,2 6 输出: 3 说明: 1,2,3和...4,2两个序列均能满足要求,所以最长的连续序列为1,2,3,因此结果为3。...java题解 题解 数据量不大,简单的两层循环暴力即可

    12610

    用经典例题轻松帮你搞定贪心算法

    如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。...给定一个整数序列,返回作为摆动序列的最长子序列的长度。通过从原始序列中删除一些(也可以不删除)元素来获得子序列,剩下的元素保持其原始顺序。 ?...可以看到[5,10,13,15]是一个连续递增的子序列,5处于17之后是符合题意的,所以一定将其保留,而对于[10,13,15]三个元素,只有保留15才可以形成摆动序列。...所以对于一段连续递增的子序列,只有保留这段子序列的首尾元素时,才能形成一个摆动序列,并且这也加大了尾部的后一个元素成为摆动序列的下一个元素的可能性。...同理连续递减的子序列也做如上操作,比如图中的[15,10,5]。 解决这道题的关键就在于如何保留连续连续递增的子序列首尾元素,结合栈是一个很好的方法,但出栈入栈的条件是什么呢?

    85330

    排序算法

    (Max-Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点 使得i节点之后的下标都满足最大堆的性质 创建最大堆(Build-Max-Heap):将堆所有数据重新排序,使其成为最大堆 堆排序...(Heap-Sort):移除位在第一个数据的根节点,并做最大堆调整的递归运算 交换排序 冒泡排序 思路 临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换, 这样一趟过去后,最大或最小的数字被交换到了最后一位...我们可以将其等长地分到10000个虚拟的“桶”里面,这样,平均每个桶只有10000个数。如果每个桶都有序了,则只需要依次输出为有序序列即可。 将待排数据按一个映射函数f(x)分为连续的若干段。...理论上最佳的分段方法应该使数据平均分布;实际上,通常采用的方法都做不到这一点。显然,对于一个已知输入范围在【0,10000】的数组,最简单的分段方法莫过于x/m这种方法,例如,f(x)=x/100。...“连续的”这个条件非常重要,它是后面数据按顺序输出的理论保证 分配足够的桶,按照f(x)从数组起始处向后扫描,并把数据放到合适的桶中。

    20810

    相关题目汇总分析总结

    Maximum Subarray/ 最大子序和 由 N 个整数元素组成的一维数组 (A[0], A[1],…,A[n-1], A[n]),这个数组有很多连续子数组,那么其中数组之和的最大值是什么呢?...,找到一条从塔顶到塔底的路径,使路径上的所有点的和最小,从上一层到下一层只能挑相邻的两个点中的一个。...二维DP 布尔数组 Longest Palindromic Substring/最长回文子串 给出一个字符串S,找到一个最长的连续回文串。...数字数组 0-1背包 0-1背包问题 完全背包、多重背包 完全背包问题与01背包问题的区别在于每一件物品的数量都有无限个,而01背包每件物品数量只有一个。...Distinct Subsequences/不同子序列 给定S和T两个字符串,问把通过删除S中的某些字符,把S变为T有几种方法?

    2.2K20

    《剑指Offer》50道算法面试题

    面试题6:通过前序遍历和中序遍历重建二叉树 面试题7:用两个栈实现队列 面试题8:旋转数组的最小数字 面试题9:斐波那契数列 面试题10:二进制中1的个数 面试题11:数值的整数次方 面试题12:打印从...1到最大的n位数 面试题13:在O(1)的时间删除链表结点 面试题14:调整数组顺序使奇数位于偶数前面 面试题15:链表中倒数第k个结点 面试题16:反转链表 面试题17:合并两个排序的链表 面试题18...:判断二叉树B是否为A的子结构 面试题19:二叉树的镜像 面试题20:顺时针打印矩阵 面试题21:包含min函数的栈 面试题22:已知栈的压入序列,判断是否为弹出序列 面试题23:从上往下打印二叉树 面试题...29:数组中出现次数超过一半的数字 面试题30:从n个整数中找出最小的k个数 面试题31:连续子数组的最大和 面试题32:从1到n的整数中1出现的次数 面试题33:把数组排成最小数 面试题34:求第n个丑数...面试题40:数组中只出现一次的数字(除两个数字外,其余都出现两次) 面试题41.1:递增排序数组中查找和为s的两个数 面试题41.2:打印出和为s的连续正数序列 面试题42.1:翻转单词顺序,但单词中字符顺序不变

    2.8K20

    【算法专题】贪心算法

    可以证明,无法通过少于 3 个操作使数组和减少至少一半。...子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。 给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度 。...递增的三元子序列 题目链接 -> Leetcode -334.递增的三元子序列 Leetcode -334.递增的三元子序列 题目:给你一个整数数组 nums ,判断这个数组中是否存在长度为 3 的递增子序列...最长连续递增序列 题目链接 -> Leetcode -674.最长连续递增序列 Leetcode -674.最长连续递增序列 题目:给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度...尽管[1, 3, 5, 7] 也是升序的子序列, 但它不是连续的,因为 5 和 7 在原数组里被 4 隔开。

    13510

    【刷题】2020最新剑指Offer汇总

    调整数组顺序使奇数位于偶数前面 22. 链表中倒数第 K 个结点 23. 链表中环的入口结点 24. 反转链表 25. 合并两个排序的链表 26....数组中出现次数超过一半的数字 40. 最小的 K 个数 41.1 数据流中的中位数 41.2 字符流中第一个不重复的字符 42. 连续子数组的最大和 43....从 1 到 n 整数中 1 出现的次数 44. 数字序列中的某一位数字 45. 把数组排成最小的数 46. 把数字翻译成字符串 47. 礼物的最大价值 48. 最长不含重复字符的子字符串 49....第一个只出现一次的字符位置 51. 数组中的逆序对 52. 两个链表的第一个公共结点 53.1 数字在排序数组中出现的次数 53.2 0~n-1中缺失的数字 54....和为 S 的两个数字 57.2 和为 S 的连续正数序列 58.1 翻转单词顺序列 58.2 左旋转字符串 59. 1滑动窗口的最大值 59.2 队列的最大值 60

    89020

    C++ 算法进阶系列之聊聊动态规划的两把刷子

    最长递增子序列 3.1 问题描述 给定一个无序的整数数组,找到其中最长上升子序列的长度。...说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。子序列和子串的区别,子串是连续的,子序列不一定是连续的。 ### 3.2 问题分析 如何使用动态规划思想解决此问题。...创建一维动态dp数组。记录当数组中的数据规模变化时,其子序列的长度。初始值为 1,数列是自己的子序列。 从左向右扫描原始数组,扫描到数据 10时,显然,其子序列的个数为 1。...扫描到5时,其比10、9小,但比2大,可以成为以2为当前状态值的递增子序列。 扫描到3时,因3只比2大,此时最长子序列应该是以2结束时的最长子序列加1。...同理,当扫描到101,因为它比前面的所有数字都大,则需要在已经填充的dp数组中找出最大值且再加 1。 按相同的原理,最后 dp数组中的值应该如下所示。

    23710

    动态规划,它来了

    这几个常见的动态规划有:连续子数组最大和,子数组的最大乘积,最长递增子序列(LIS),最长公共子序列(LCS),最长公共子串,最长公共子串,不同子序列。 什么是动态规划 首先很多人问,何为动态规划?...连续子数组最大和 给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。...你好好想想枚举一下正的收入囊中,那个问题没意义的。 连续子数组最大乘积 给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。...最长公共子序列也成为LCS.出现频率非常高!...字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。

    54720

    66道前端算法面试题附思路分析助你查漏补缺

    调整数组顺序使奇数位于偶数前面 题目: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半 部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变...叠加的值如果为负数,则将叠加值初始化为 0,因为后面的数加上负 数只会更小,因此需要寻找下一个正数开始下一个子数组的判断。一直往后判断,直到这个数组遍历完成为止,得到最大的值。...使用这一种方法的时间复杂度为 O(n)。 详细资料可以参考: 《连续子数组的最大和》 31....现在把问题交给你,你能不能也很快的找出所有和为 S 的连续正数序列?Good Luck!输出描述:输出所有和为 S 的连续正数序列。序 列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。...当序列数组的和等于所求值时,打印出此时的正数序列,然后继续往后遍历,寻找下一个连 续序列,直到数组遍历完成终止。 详细资料可以参考: 《和为 s 的连续正数序列》 42.

    1.8K20

    首个科学计算基座大模型BBT-Neutron开源!突破大科学装置数据分析瓶颈

    传统的BPE分词方法在分词数字时可能会引入歧义和不一致,特别是在高能物理、天文观测等领域,分析复杂的实验数据成为瓶颈。...BPE方法的局限性 歧义和不一致性 BPE是一种基于频率的token 化方法,它会根据上下文将数字分割成不同的子单元,这可能导致同一数字在不同上下文中有不同的分割方式。...这种分割方式丢失了原始数值的固有意义,因为数字的完整性和数值关系被破坏了。 token ID的不连续性 BPE会导致数值的token ID不连续。...单数字token化的问题 尽管单数字token化方法简单直接,但它也会导致多位数数字的token ID不连续。...对于科学公式或符号:复杂的表达式被解析并序列化成字节序列,捕捉公式的结构和内容。例如,公式E = mc^2被编码为字节数组[69, 61, 109, 99, 94, 50],代表了公式的结构和变量。

    9210

    PAT 1007 Maximum Subsequence Sum (25分) 最大连续子序列和

    Sample Input: 10 -10 1 2 3 4 -5 -23 3 7 -21 Sample Output: 10 1 4 题目大意 给定一个整数序列,让找出其中 和 最大的 连续子序列...如果有多个和最大的连续子序列,输出其中开始元素和结束元素下标最小(也就是最靠前)的那个子序列。如果所有整数都是负数,规定和为0,输出序列的首元素和尾元素。...leftIndex表示最终子序列的第一个元素在序原列中的下标,初始化为0,rightIndex表示最终子序列的最后一个元素在序原列中的下标,初始化为序列长度-1。...我们维护一个临时的连续子序列寻找局部最优解,从数组第一个元素开始,累加当前元素,每当它的和 > maxSum时,就用它取代全局最优(它的起点作为最终起点,它的终点(当前元素的位置)作为最终终点);每当它的和...i; } } // 全为负数的情况下,返回累加和0 if (maxSum < 0) maxSum = 0; // 输出最大和,连续序列的第一个数字(是值

    68630

    Leetcode#53.Maximum Subarray(最大子序和)

    题目描述 给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大。...例如,给定序列 [-2,1,-3,4,-1,2,1,-5,4], 连续子序列 [4,-1,2,1] 的和最大,为 6。...只遍历数组一遍,当从头到尾部遍历数组A, 遇到一个数有两种选择 (1)加入之前subArray (2)自己另起一个subArray 设状态S[i], 表示以A[i]结尾的最大连续子序列和,状态转移方程如下...代码实现 package Array; /** * 题目: * 最大子序和 * 给定一个序列(至少含有 1 个数),从该序列中寻找一个连续的子序列,使得子序列的和最大。...* 只遍历数组一遍,当从头到尾部遍历数组A, 遇到一个数有两种选择 (1)加入之前subArray (2)自己另起一个subArray * 设状态S[i], 表示以A[i]结尾的最大连续子序列和

    81750

    最大连续子数列和

    最大连续子数列和一道很经典的算法问题,给定一个数列,其中可能有正数也可能有负数,我们的任务是找出其中连续的一个子数列(不允许空序列),使它们的和尽可能大。我们一起用多种方式,逐步优化解决这个问题。...为了更清晰的理解问题,首先我们先看一组数据: 8 -2 6 -1 5 4 -7 2 3 第一行的8是说序列的长度是8,然后第二行有8个数字,即待计算的序列。...因为已知起点,所以这两个结果都能在O(N)的时间复杂度能算出来。 递归不断减小问题的规模,直到序列长度为1的时候,那答案就是序列中那个数字。...大道至简,最大连续子序列和问题的完美解决 很显然,解决此问题的算法的时间复杂度不可能低于O(N),因为我们至少要算出整个序列的和,不过如果空间复杂度也达到了O(N),就有点说不过去了,让我们把num数组也去掉吧...它的时间复杂度是O(N),空间复杂度是O(1),这达到了理论下限!唯一比较麻烦的是ans的初始化值,不能直接初始化为0,因为数列可能全为负数! 至此,最大连续子序列和的问题已经被我们完美解决!

    1.1K20

    详解单调队列算法

    带限制的子序列和 题目描述 给你一个整数数组 nums 和一个整数 k ,请你返回「非空」子序列元素和的最大值,子序列需要满足:子序列中每两个「相邻」的整数 nums[i] 和 nums[j],它们在原数组中的下标...数组的子序列定义为:将数组中的若干个数字删除(可以删除 0 个数字),剩下的数字按照原本的顺序排布。...假设当前有一个子序列 A,现在想在 A 后面再添加一个元素 x,则我们只需要考虑 x 和 A 中最后一个元素的坐标差是否小于等于 k,而不用考虑 A 中的所有元素。...和至少为 K 的最短子数组 题目描述 返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 。 如果没有和至少为 K 的非空子数组,返回 -1。...K 的最短非空连续子数组,由于涉及连续子数组和的求取,所以先对 A 做一个前缀和。

    90120

    前端工程师leetcode算法面试必备-二分搜索算法(下)

    长度最小的子数组给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的连续子数组。如果不存在符合条件的连续子数组,返回 0。...j 的连续子数组之和,可以通过 sumsj+1 - sumsi 求出。  ...并且根据前缀和的差值与 s 的比较,可以判断满足条件的连续子数组的终止下标落在哪个区间内。图片  通过前缀和对数组的预处理以及二分搜索算法,时间复杂度为 O(nlogn)。...2、Two Points  除了上述二分搜索算法的处理方法之外,可能最简单暴力的方法就是通过嵌套循环找出长度最小的连续子数组,但是这种方法的时间复杂度为 O(n^2),有没有方法将其降低到 O(n) 的时间复杂度呢...图片  在本题中,通过头指针和尾指针维护当前连续子数组的和值窗口:当前窗口的和值大于 s ,那么头指针向后移动一位;当前窗口的和值小于 s ,那么尾指针向后移动一位;图片三、153.

    57510
    领券