博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题31.连续子数组的最大和
阅读量:6866 次
发布时间:2019-06-26

本文共 1428 字,大约阅读时间需要 4 分钟。

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或者连续多个整数组成一个子数组。

求所有子数组的和的最大值。要求时间复杂度O(n)

 

本题可以把所有子数组全部找出来再求其和的最大值便可以得出,但是这样会导致算法的时间复杂度

为0(n^2),所以有两种方法来解决这个问题。

方法1.数组扫描

我们扫描一遍数组并且累加数组元素的和,当遇到累加和为负数的时候,我们从数组中

下一个元素开始重新累加。直到遍历完成。

 

方法2.动态规划的方法

有这样一个公式

   { pdata[i]           if f(i-1)<=0

f(i){ 

    {f(x-i)+pdata[i]   if f(i-1)>0

怎么理解呢,f(i)是一个数组,其代表数组中第1-i个子数组的最大和,当f(i-1)为负的时候,此时加上一个pdata[i]会更小

所以f(i)=pdata[i]

当f(i-1)为正的时候,此时加上一个pdata[i]会更大,所以f(i)=f(i-1)+pdata[i];

 

 

下面我们分别实现两种方法:

第一种扫描法(如果只想找最大的则不必找出最大子数组到底是哪些元素,复杂度0(n))

1 #include 
2 using namespace std; 3 4 5 int FindSerialMaxSum(int* pData,int nLength) 6 { 7 int CurrSum=0; 8 int MaxSum=0; 9 10 if(pData==NULL||nLength==0)11 return 0;12 int *ChildArray=new int[nLength];13 for(int k=0;k
MaxSum)36 MaxSum=CurrSum;37 }38 39 int Temp=0;40 cout<<"The Child Array is : ";41 for(int l=0;pData[l]!=0;l++)42 {43 if(Temp==MaxSum)44 {45 break;46 }47 Temp+=ChildArray[l];48 cout<
<<" ";49 }50 cout<

运行结果:

 

 

2.动态规划的方法(f(i)为存储0-i子数组的最大和)

1 #include 
2 using namespace std; 3 4 5 int FindSerialMaxSum(int* pData,int nLength,int* f) 6 { 7 f[0]=pData[0]; 8 int MaxSum=0; 9 for(int i=1;i
MaxSum)21 MaxSum=f[i];22 }23 for(int k=0;k

运行截图:

转载于:https://www.cnblogs.com/vpoet/p/4775896.html

你可能感兴趣的文章
I.MX6 git patch
查看>>
Google Native Client入门
查看>>
spark能传递外部命名参数给main函数吗?
查看>>
[LeetCode] Convex Polygon 凸多边形
查看>>
递归神经网络
查看>>
iframe父页面和子页面相互调用的方法
查看>>
【批处理学习笔记】第十七课:截取字符串
查看>>
[Erlang 0066] Erlang orddict
查看>>
Hadoop HDFS 用户指南
查看>>
体验mssql-cli
查看>>
ASP.NET MVC之国际化(十一)
查看>>
Swift析构器
查看>>
&#9733;路由递归查询方法及相关图…
查看>>
SpringMvc入门
查看>>
scrapy 登录
查看>>
上海往事之看房子
查看>>
SQL Server使用规范
查看>>
高性能mysql主存架构
查看>>
《Programming WPF》翻译 第7章 3.笔刷和钢笔
查看>>
[20160906]修改口令在内存中.txt
查看>>