[求算法] 面试过程中遇到一题,求大牛给个算法

=PNZ=BeijingL 2011-07-31 08:37:51
话说有个一数组a[] ,a[]中存有随机出现的正整数和负整数,求连续数组段最大和的值,
比如:a[]{1,5,-3,-1,8,-1,9,-7,9,6} ,最大是(8-1+9=16)
这好象是个算法题目,求解
...全文
151 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
=PNZ=BeijingL 2011-08-01
  • 打赏
  • 举报
回复
谢谢大家

再次谢谢7楼的朋友
HelloRandom 2011-07-31
  • 打赏
  • 举报
回复
sorry ,我错了,7L的回答是最正确的
HelloRandom 2011-07-31
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101023/20/5652ccd7-d510-4c10-9671-307a56006e6d.html
第3题

扫描一遍
int index = 0;
int current = 0;
int max = a[0];
从第一个开始,如果遇到的是非负数数,curent += a[index];
如果是负数 if(max<current) max = current;current = 0;
index++;

这里只是思路,没有详细验证
stein42 2011-07-31
  • 打赏
  • 举报
回复
这个只扫一遍就可以了,weiss的书开始就有讲
未注销 2011-07-31
  • 打赏
  • 举报
回复
DP问题吧.
int Maxsub(vector<int>& a)
{
int maxsum = a[0];
int thismax = 0;
for (unsigned int i = 0; i < a.size(); ++i)
{
thismax += a[i];
if (thismax > maxsum)
maxsum = thismax;
else if(thismax < 0)
thismax = 0;
}
return maxsum;
}
福禄小胸弟 2011-07-31
  • 打赏
  • 举报
回复
呵呵~楼主这个我做过哦~~
首先你给出的答案是错误的...
正确的应该是整个数组相加 1+5+(-3)+(-1)+8+(-1)+9+(-7)+9+6=26...
给你算法思路,你自己实现吧,我的思路是遍历两边...

第一遍先将相连的同符号的数全部加起来变成一个数...零加在正数里就可以。
记录下来相加数组元素的第一个和最后一个的下标。
之后的数组大小最坏情况应该就是n了,也就是说正负相间还没有零...

然后第二遍
从左向右遍历一遍数组,既然是求出连续的数组元素相加和最大的数组段,那么很显然在遍历过程中,如果第一个是负数一定舍掉,你可以把后面的数组作为一个整体,后面的数加上这个负数一定比后面整体的值小,所以这个数组段开头的数一定是正数。

前面的这些大家应该都比较清楚该这么做,关键在后面...
向后加,只要所加的值大于零就一直向后加,如果加了后面的数结果变小了那就记录下这个值和相应的下标
为什么呢?
可以把整个数组分为两段,前面的是你所加值的总和,后面的是将要加的数,只要前面的那段大于零,加上后面的一定会比后面的大。所以,向后加吧~~
在加每一个数的时候都根据上面的条件判断一下,遍历一遍即可得到相加的最大那个数组段。
当然中间还需要记录些临时最大段的数组下标,自己实现吧呵呵~~

如 1 5 -3 -1 8 -1 9 -7 9 6
第一次遍历: 6 -4 8 -1 9 -7 15
(0,1)(2,3) (4) (5) (6) (7) (8,9)
第二次遍历过程: 6 -4 8 -1 9 -7 15 记录下最大数据段为 0~1,且值为6
2 8 -1 9 -7 15 2<6,不记录
10 -1 9 -7 15 10>6,记录最大数据段为0~4
9 9 -7 15 9<10,不记录
18 -7 15 18>10,记录最大数据段为0~6
11 15 11<18,不记录
26 26>18,记录最大数据段为0~9
所以...最后的结果就是...
DontKissBossAss 2011-07-31
  • 打赏
  • 举报
回复
dp问题
int MaxSub (int a[])   
{
int dp[N], max, i;

max = dp[0] = a[0];
for (i=1; i<N; i++)
{
if (dp[i-1] > 0)
dp[i] = dp[i-1] + a[i];
else
dp[i] = a[i];
if (dp[i] > max)
max = dp[i];
}
return max;
}
=PNZ=BeijingL 2011-07-31
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 flylee 的回复:]

应该是问求连续子段最大和的O(n)算法吧
[/Quote]

最大不是16。我题目中数字记错了。 就是连续N个数相加会有一个最大的值。求这组数和结果

好象就是3楼说的那意思
flylee 2011-07-31
  • 打赏
  • 举报
回复
应该是问求连续子段最大和的O(n)算法吧
LucEaspe 2011-07-31
  • 打赏
  • 举报
回复
lz表意不明
roycelwh 2011-07-31
  • 打赏
  • 举报
回复
这不对。连续是怎样的连续?
1+5-3-1+8-1+9=18
所有相加还更大。
所以说,是连续三个?

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧