首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

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

    问题描述:给一个数组,有正有负,求其连续子序列的最大值 解法1:穷举暴力法 枚举左端点跟右端点,然后遍历更新所有的子序列和,最终得到结果就是最大的 #include using...,队首元素是整个序列的最小值,维护队列的同时,用前缀和的元素减去这个最小值,得到值最大,为这数组的子序列的最大值 #include using namespace std...,记作left_sum; 2.计算k+1到right的和,记作right_sum; 3.跨边界和,以k为中心向两边分别求和 1.从中心向左扩张一步,记录当前sum1,并于上一步对比, 若大于,则更新...= solve4(1,n); cout<<ans<<endl; system("pause"); return 0; } 4.动态规划 思路:这已经是可以用动态规划思想去考虑的最简单的问题了...最后我们只需要找出所有最大子段中,最大的那个。

    6.3K30

    LeetCode 53.最大子序列和 - JavaScript

    例如对于 [-2,1,-3,4,-1,2,1,-5,4]来说,连续子数组 [4,-1,2,1] 的和最大,为 6。...dp[i] += dp[i - 1]; } res = Math.max(res, dp[i]); } return res; }; 时间复杂度和空间复杂度都是...本题的贪心法的思路是:在循环中找到不断找到当前最优的和 sum。 注意:sum 是 nums[i] 和 sum + nums[i]中最大的值。这种做法保证了 sum 是一直是针对连续数组算和。...例如 [1, 2, 3, 4] 被分为 [1, 2] 和 [3, 4] 通过递归计算,得到左右两部分的最大子序列和是 lsum,rsum 从数组中间开始向两边计算最大子序列和 cross 返回 max(...可以看到,分治法可行的关键的是:最大子序列和只可能出现在左子数组、右子数组或横跨左右子数组 这三种情况下。

    1.1K20

    最大子序列和问题之算法优化

    在这个问题中,最大子序列和可能在三处出现:即左半部序列、右半部序列、穿过中部从而占据左右两半部分的序列。前两种情况可以通过递归求解。...而递归的基准情况(base cases)是序列只有一个元素(left == right),若该元素大于0,则返回该元素,否则返回0。...故该序列的最大子序列和为max(6,4,0)= 6。 时间复杂度分析: 假设T(n)为求解大小为n的最大子序列和问题所花费的时间。...---- 算法四: 算法三利用递归较好的解决了最大子序列和问题,但仔细分析,在递归过程中,同一个元素很可能多次被操作,有没有更高效的算法?...)如果大于0,不管当i > t的元素大小如何,加上thisSum总会使之后的和变大,而如果thisSum小于0,肯定会使之后的和变小,既然还会变小,那干脆就重新来过(thisSum = 0),有些另起炉灶的意味

    87930

    最大子序列和问题之算法优化

    在这个问题中,最大子序列和可能在三处出现:即左半部序列、右半部序列、穿过中部从而占据左右两半部分的序列。前两种情况可以通过递归求解。...而递归的基准情况(base cases)是序列只有一个元素(left == right),若该元素大于0,则返回该元素,否则返回0。...故该序列的最大子序列和为max(6,4,0)= 6。 时间复杂度分析: 假设T(n)为求解大小为n的最大子序列和问题所花费的时间。...算法四: 算法三利用递归较好的解决了最大子序列和问题,但仔细分析,在递归过程中,同一个元素很可能多次被操作,有没有更高效的算法?先上代码!...)如果大于0,不管当i > t的元素大小如何,加上thisSum总会使之后的和变大,而如果thisSum小于0,肯定会使之后的和变小 ,既然还会变小,那干脆就重新来过(thisSum = 0),有些另起炉灶的意味

    1.3K70

    最大子序列和的问题的解(1)

    最暴力的做法,复杂度O(N^3) 暴力求解也是容易理解的做法,简单来说,我们只要用两层循环枚举起点和终点,这样就尝试了所有的子序列,然后计算每个子序列的和,然后找到其中最大的即可,C语言代码如下: #include...); for(int i = 1; i <= N; i++) scanf("%d", &num[i]); int ans = num[1]; //ans保存最大子序列和...那么我们如何快速计算第i个到第j个这个序列的和?对,只要用sum[j] - sum[i-1]就可以了!这样的话,我们就可以省掉最内层的循环,让我们的程序效率更高!...int i = 1; i <= N; i++) { sum[i] = num[i] + sum[i - 1]; } int ans = num[1]; //ans保存最大子序列和...我们已知一个sum数组,sum[i]表示第1个数到第i个数的和,于是sum[j] - sum[i-1]表示第i个数到第j个数的和。 那么,以第n个数为结尾的最大子序列和有什么特点?

    54520

    【杭电oj】1231 - 最大子序列的和(动态规划)

    最大连续子序列是所有连续子序列中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和 为20。...在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该 子序列的第一个和最后一个元素。...Output 对每个测试用例,在1行里输出最大和、最大连续子序列的第一个和最后一个元 素,中间用空格分隔。...如果最大连续子序列不唯一,则输出序号i和j最小的那个(如输入样例的第2、3组)。若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素。...注意最负数序列的特判。

    27210

    最大子序列和O(N)算法简单分析『神兽必读』

    对于一个全为负数的序列,最长公共子序列的和值应该是0,理由在于,由0个整数所组成的空子序列也是一个子序列——最大子序列和问题从O(N^3)到线性的算法 其他情况大家也能理解了。...:-2, -3, 5, 6, -1, 8, 9 扫描到-2或-3的时候,执行/*2*/,/*5*/条件成立,所以执行/*6*/,此时ThisSum依然是0,MaxSum也是0 为什么不把开头的负数也加和到最大子序列的和中去呢...继续扫描5, 6,执行/*2*/,/*3*/条件成立,所以执行/*4*/,此时ThisSum是11,MaxSum也是11 继续扫描到-1,执行/*2*/,ThisSum变成了10,此时条件/*3*/和/...---- UPDATE 或许你会想到了,有时候最大子序列和是某一小段的话,比如是后半段,但是这个算法明显给人的感觉就是一路加和过来呀,好像是认为越长的子序列和越大呀?!...这里继续做一个假设:5, 6,-2, -3,-1, -7,8, 9 明显最大的子序列是8,9,中间跨度的那些负数都不应该加起来,这样的想法的确是对的,但是这个算法也做到了啊。

    1.1K20
    领券