社区
数据结构与算法
帖子详情
求连续和最大的数组段
ralhander
2009-10-28 02:05:19
n个元素的连续数组,有正有负
求连续和最大的一段数组元素。
突然想到这个问题,请高手解答。
...全文
253
12
打赏
收藏
求连续和最大的数组段
n个元素的连续数组,有正有负 求连续和最大的一段数组元素。 突然想到这个问题,请高手解答。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
kon3155
2009-10-28
打赏
举报
回复
见 http://topic.csdn.net/u/20081113/08/646efaba-c65b-4ed4-8de8-224dbf712d2e.html 3楼
时间复杂度O(N)
holyblood
2009-10-28
打赏
举报
回复
可不可以这样:
先将数组按正负分段,即工b[0]:={a[0],a[1],……,a[j]|a[i]>=0},b[1]={a[j+1],a[j+2],……,a[k]|a[i]<0},……,以此类推;
首先可以肯定所求段一定以全正的b[i]开头,以全正的b[i]结尾,若不然,一定可以在开头(结尾)处补充上(下)一段正的b[i]使和最大;
再可以证明一个事实:如果b[i](正段)+b[i+1](由定义一定是负段)<=0,则可以这两段必不在所需段内开头或结尾,若不然,去掉这两段后和应该更大,从开头找第一个b[i]+b[i+1]>0的段,将其前面的元素去掉,同理从结尾找第一个b[i]+b[i+1]>0的段,将其后面的元素去掉;
令c[k]=b[i]+b[i+1],其中b[i]是正段和,所得一新数列c[k],重复上面将c[k]分正负段,再考虑前面介绍的方法以此递归;
这样至多递归log2N次,每次递归要O(N)步。
绿色夹克衫
2009-10-28
打赏
举报
回复
连续子段最大和问题,LZ可以搜索一下!已经讨论过很多遍了,用Dp,O(n)就可以解。
只要子段的和>0,那么就继续累加,否则从下一个数开始重新算!
leafank
2009-10-28
打赏
举报
回复
自己一点想法,以连续负数为分割,把数组分为多个数组段,然后检测各个负数段的和对前后正数段的和的影响,以次来获得影响最小的一个
ralhander
2009-10-28
打赏
举报
回复
[Quote=引用 7 楼 silitex 的回复:]
A[0] + ... + A[j-1] <= 0
-->
A[0] + ... + A[i-1] <= 0
[/Quote]
这个思想是好的,但不一定对,比如说最大连续和在你计算过程中被抛弃了呢?-1 9 -10 12 -13.。。。。。
Silitex
2009-10-28
打赏
举报
回复
A[0] + ... + A[j-1] <= 0
-->
A[0] + ... + A[i-1] <= 0
Silitex
2009-10-28
打赏
举报
回复
倒是想到了一个方法可以快速求解,方法如下:
假设A[i]~A[j]就是那个要求最大的两个断点,那么有如下条件成立:
A[i] + ... + A[j] >= A[0] + ... + A[i] + ... A[j]
即A[0] + ... + A[j-1] <= 0
所以,程序分别从两端开始加,如果判断到小于0,则说明前面连续单元可以放弃不要。
源代码见下一贴。
ralhander
2009-10-28
打赏
举报
回复
[Quote=引用 3 楼 donkey301 的回复:]
设原数组为A[n]
新生成一个数组B[n]
B[n] = A[0]+A[1]+...+A[i]
然后判断B[j]-B[i],其中j>i的最大值。最大值的i,j点就是要求的两个端点
[/Quote]
俄,这个嘛,我想到过用这个数组求解一个数组最大差值问题。。
没有其他的更好的方法了吗。。比如用堆和栈。。
donkey301
2009-10-28
打赏
举报
回复
搞错了一点,应该是i+1,j是要求的区间两个端点
donkey301
2009-10-28
打赏
举报
回复
设原数组为A[n]
新生成一个数组B[n]
B[n] = A[0]+A[1]+...+A[i]
然后判断B[j]-B[i],其中j>i的最大值。最大值的i,j点就是要求的两个端点
ralhander
2009-10-28
打赏
举报
回复
[Quote=引用 1 楼 veron_04 的回复:]
计算所有可能的连续和,排序比较。。
[/Quote]
这个复杂度太高了
贝隆
2009-10-28
打赏
举报
回复
计算所有可能的连续和,排序比较。。
JAVA近百种算法大全
5. 归并排序:同样采用分治法,将
数组
拆分成小
段
,分别排序后合并。 6. 堆排序:构建一个大顶堆(或小顶堆),然后将堆顶元素与末尾元素交换,再调整堆。 二、搜索算法 1. 线性搜索:遍历整个
数组
或列表,查找目标...
c语言
求
最大
数组
和,C语言
求
连续
最大
子
数组
和的方法
C语言
求
连续
最大
子
数组
和的方法本文实例讲述了C语言
求
连续
最大
子
数组
和的方法,是非常实用的技巧。分享给大家供大家参考。具体实现方法如下:#include using namespace std;int array[] = {1, -2, 3, 10, -4, 7, 2, ...
【面试题】
求
连续
子
数组
的
最大
和(三种解法)
给定一个
数组
array[1, 4, -5, 9, 8, 3, -6],在这个数字中有多个子
数组
,子
数组
和
最大
的应该是:[9, 8, 3],输出20,再比如
数组
为[1, -2, 3, 10, -4, 7, 2, -5],和
最大
的子
数组
为[3, 10, -4, 7, 2],输出18。...
求
数组
连续
最大
和(暴力
求
解和动态规划)
1. 问题 一个有 n 个元素的
数组
,这 n 个元素既可以是正数也可以是负数,
数组
中
连续
的一...依次遍历生成所有子
数组
,并
求
出子
数组
的和,然后取
最大
值就是题目要
求
。 package main import ( "fmt" "math" ) func g
求
非
连续
最大
子
数组
题目:给出一个
数组
,
求
出
最大
非
连续
子
数组
,返回该子
数组
元素之和。要
求
子
数组
中元素在原
数组
中不能相邻。示例:
数组
{3,5,7,9,-2},
最大
非
连续
子
数组
为{5,9},返回14.思路:使用max
数组
记录截止到第i个元素时,...
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章