求和最大连续子数组,我的另类思路,求问题所在

longxpzhh 2012-11-13 03:05:37
笔试碰到的和最大连续子数组问题,要求时间复杂度O(n)
当时我的思路是这样的:

假设要求的数组为a[n],定义b[n],其中b[i]=a[i]+b[i-1],那么子数组a[i]到a[j](j>=i)的和即为b[j]-b[i-1],如果i=0,则为b[j];
子数组和最大问题转变为找最大的b[j]-b[i-1](j>=i);
寻找b[n]的最大值b[max]与最小值b[min];

当b[min]>0,得结果为a[0]到a[max],和为b[max];
当min<max,则结果为a[min+1]到a[max],和为b[max]-b[min];
当min=max,可知a[1]到a[n]全为0,结果为a[0];
当min>max,寻找b[0]到b[max]中的最小值b[m],与b[min]到b[n]中的最大值b[n];
b[max]-b[m](如b[m]大于0,则取b[max])与b[n]-b[min]比较大小,得出结果;

效率分析:其中b[n]初始化、寻找最大值、最小值的时间复杂度都为O(n),其余操作为常数时间,可得总的时间复杂度为O(n),空间复杂度为O(n);
我想知道我的思路哪里有问题
...全文
150 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
newtee 2012-11-17
  • 打赏
  • 举报
回复
引用 4 楼 h_w_m 的回复:
引用 1 楼 zhuankeshumo 的回复:要是把题改一下,变成求有最大和的子数组那就好玩了 时间复杂度就不在太在意了,得到各种可行的方法是第一步
先排序一次 然后和1楼相似方法即可
h_w_m 2012-11-17
  • 打赏
  • 举报
回复
引用 1 楼 zhuankeshumo 的回复:
要是把题改一下,变成求有最大和的子数组那就好玩了 时间复杂度就不在太在意了,得到各种可行的方法是第一步
JiMoKuangXiangQu 2012-11-17
  • 打赏
  • 举报
回复
读读<<编程之美>>.
Red_Flame 2012-11-17
  • 打赏
  • 举报
回复
DP经典题型啊,
newtee 2012-11-13
  • 打赏
  • 举报
回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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